{"_id":"@calltelemetry/cisco-ris-mcp","_rev":"10-d1d0bd9549a62d4855feb8c78cf8eae8","name":"@calltelemetry/cisco-ris-mcp","dist-tags":{"latest":"1.4.0"},"versions":{"1.0.0":{"name":"@calltelemetry/cisco-ris-mcp","version":"1.0.0","keywords":["mcp","cisco","cucm","ris","risport","perfmon","realtime","monitoring"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-ris-mcp@1.0.0","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-ris-mcp":"build/index.js"},"dist":{"shasum":"24842b625e7d1621babfef320b0d732379401dd0","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-ris-mcp/-/cisco-ris-mcp-1.0.0.tgz","fileCount":5,"integrity":"sha512-7pIso/vi32QXBK2pUPmQ47Ba0IQSdgSe1lOgTzK0cYn2OJXuZSOO9oW08U2gZjL43magMPHcfN7V0taozH5Cbw==","signatures":[{"sig":"MEUCIQCH/f+MYNxAQPo1VAZhnbpse6ojnnXDdpFGbQHhhMALigIgV+vopN78KHQG0IAj/aIJwN0IZhIVYAUfBa6Sy40R2jU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134962},"main":"build/index.js","type":"module","engines":{"node":">=18"},"gitHead":"ab8c37eb63c8f719877263cb33a08c02e74180f9","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint && yarn test","typecheck":"tsc --noEmit","semantic-release":"semantic-release"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"10.9.4","description":"MCP server for Cisco CUCM RIS (Real-time Information Service) and PerfMon APIs","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^4.3.6","fast-xml-parser":"^4.5.3","@modelcontextprotocol/sdk":"^1.27.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsx":"^4.21.0","vite":"^7.3.1","eslint":"^9.39.4","vitest":"^4.1.0","prettier":"^3.8.1","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/node":"^25.5.0","semantic-release":"^25.0.3","typescript-eslint":"^8.57.1","@vitest/coverage-v8":"^4.1.0","@semantic-release/git":"^10.0.1","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cisco-ris-mcp_1.0.0_1773841692417_0.4027891510581656","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@calltelemetry/cisco-ris-mcp","version":"1.1.0","keywords":["mcp","cisco","cucm","ris","risport","perfmon","realtime","monitoring"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-ris-mcp@1.1.0","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-ris-mcp":"build/index.js"},"dist":{"shasum":"0e5aeb32f1f77d4aac969c085c2138ec4d2fcb63","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-ris-mcp/-/cisco-ris-mcp-1.1.0.tgz","fileCount":5,"integrity":"sha512-1YUXak/B6DbOx2RwqwJn6WAGcqlHDn0tL3Os//2KzleA8VHFkFfGKvwiFH+sLkwn1DWh12GFk5PQBeBeRGD/bw==","signatures":[{"sig":"MEUCIQDMStM4JnVaKo6b1uwVgMPauNMgH6UXcbERoul86nKYagIgdnfN1uKgwjTMv8a2FRppIRKGlfbB1eI7ukob3/MBCXw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135447},"main":"build/index.js","type":"module","engines":{"node":">=18"},"gitHead":"c9c675c83686a7f0a0e78ac3a38070361e06f970","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint && yarn test","typecheck":"tsc --noEmit","semantic-release":"semantic-release"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"10.9.4","description":"MCP server for Cisco CUCM RIS (Real-time Information Service) and PerfMon APIs","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^4.3.6","fast-xml-parser":"^4.5.3","@modelcontextprotocol/sdk":"^1.27.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsx":"^4.21.0","vite":"^7.3.1","eslint":"^9.39.4","vitest":"^4.1.0","prettier":"^3.8.1","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/node":"^25.5.0","semantic-release":"^25.0.3","typescript-eslint":"^8.57.1","@vitest/coverage-v8":"^4.1.0","@semantic-release/git":"^10.0.1","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cisco-ris-mcp_1.1.0_1773844382504_0.3541196494266694","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@calltelemetry/cisco-ris-mcp","version":"1.1.1","keywords":["mcp","cisco","cucm","ris","risport","perfmon","realtime","monitoring"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-ris-mcp@1.1.1","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-ris-mcp":"build/index.js"},"dist":{"shasum":"c8534be29a1a4b8521f6c9a2052fa579e62983d6","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-ris-mcp/-/cisco-ris-mcp-1.1.1.tgz","fileCount":5,"integrity":"sha512-aA58LSZmiS332dGl+KG+7RJnVtyuSZTk1E6qLEH5tcea2R9UzH2JITFzu7x7W1oSnWczOBBdUB3/kAyxKVi59w==","signatures":[{"sig":"MEUCIQDt/OWC2RMRf0vtd5XJn8twmWvLpaGu22vpx6eWbirO4wIgX0sPy97ga6A2Kz727Oh2OsqN95rDA9zJTv10Ggkcu7w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136230},"main":"build/index.js","type":"module","engines":{"node":">=18"},"gitHead":"93719798aa60e196d6ecad878ff53ba3b098c487","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint && yarn test","typecheck":"tsc --noEmit","semantic-release":"semantic-release"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"10.9.4","description":"MCP server for Cisco CUCM RIS (Real-time Information Service) and PerfMon APIs","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^4.3.6","fast-xml-parser":"^4.5.3","@modelcontextprotocol/sdk":"^1.27.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsx":"^4.21.0","vite":"^7.3.1","eslint":"^9.39.4","vitest":"^4.1.0","prettier":"^3.8.1","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/node":"^25.5.0","semantic-release":"^25.0.3","typescript-eslint":"^8.57.1","@vitest/coverage-v8":"^4.1.0","@semantic-release/git":"^10.0.1","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cisco-ris-mcp_1.1.1_1773845030475_0.7895975511653386","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@calltelemetry/cisco-ris-mcp","version":"1.1.2","keywords":["mcp","cisco","cucm","ris","risport","perfmon","realtime","monitoring"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-ris-mcp@1.1.2","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-ris-mcp":"build/index.js"},"dist":{"shasum":"bcbd51810d2b1aed14b12b37b3d60175485a6ccb","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-ris-mcp/-/cisco-ris-mcp-1.1.2.tgz","fileCount":5,"integrity":"sha512-hJsHdNzBzfNQxrjmtetNidKFtpLjqFyk4m6ggc44o1P7bHFZhpvT7Jsk8cAfEYax71kW2uRufeGSgwNuu2vGng==","signatures":[{"sig":"MEYCIQCf5YSsf6/SmkgNxZJG3ympweCyUWrstdXAyYaXpNANMAIhAOxQSPG32KQjstlruMohdkHr0MgNE3FS9LeXKV7l5+Ba","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143711},"main":"build/index.js","type":"module","engines":{"node":">=18"},"gitHead":"682eb42e6fe59c9780527d48a574b268d9b00bb7","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint && yarn test","typecheck":"tsc --noEmit","semantic-release":"semantic-release"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"10.9.4","description":"MCP server for Cisco CUCM RIS (Real-time Information Service) and PerfMon APIs","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^4.3.6","fast-xml-parser":"^4.5.3","@modelcontextprotocol/sdk":"^1.27.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsx":"^4.21.0","vite":"^7.3.1","eslint":"^9.39.4","vitest":"^4.1.0","prettier":"^3.8.1","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/node":"^25.5.0","semantic-release":"^25.0.3","typescript-eslint":"^8.57.1","@vitest/coverage-v8":"^4.1.0","@semantic-release/git":"^10.0.1","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cisco-ris-mcp_1.1.2_1773845697802_0.7085284529056957","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@calltelemetry/cisco-ris-mcp","version":"1.1.3","keywords":["mcp","cisco","cucm","ris","risport","perfmon","realtime","monitoring"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-ris-mcp@1.1.3","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-ris-mcp":"build/index.js"},"dist":{"shasum":"0b207dffee007ecdabedee2f8402979bd8c82c0a","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-ris-mcp/-/cisco-ris-mcp-1.1.3.tgz","fileCount":5,"integrity":"sha512-MpLtstyeRdHZ3cJTcNF289e3wIxWSnT9/err3fgug6eRaDtubYsfrYMMdRyywZ8DXbEvx/616rCmnSnd29lkaQ==","signatures":[{"sig":"MEUCIQCDb+eQFRsLeiswIapU/Q/xLjMhuAeNio8cxUg2iL0f8wIgSK9mvDS3un7rCAkFBgfMR4xPhkp4L09GnahDpWAI020=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143789},"main":"build/index.js","type":"module","engines":{"node":">=18"},"gitHead":"0e1893f25d7d8a4188252e750e2e1ae04a9ee941","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint && yarn test","typecheck":"tsc --noEmit","semantic-release":"semantic-release"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"10.9.4","description":"MCP server for Cisco CUCM RIS (Real-time Information Service) and PerfMon APIs","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^4.3.6","fast-xml-parser":"^4.5.3","@modelcontextprotocol/sdk":"^1.27.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsx":"^4.21.0","vite":"^7.3.1","eslint":"^9.39.4","vitest":"^4.1.0","prettier":"^3.8.1","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/node":"^25.5.0","semantic-release":"^25.0.3","typescript-eslint":"^8.57.1","@vitest/coverage-v8":"^4.1.0","@semantic-release/git":"^10.0.1","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cisco-ris-mcp_1.1.3_1773845836293_0.3220587396734611","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@calltelemetry/cisco-ris-mcp","version":"1.1.4","keywords":["mcp","cisco","cucm","ris","risport","perfmon","realtime","monitoring"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-ris-mcp@1.1.4","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-ris-mcp":"build/index.js"},"dist":{"shasum":"160d98698389c4ea28355915483cfbbaeb2c4344","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-ris-mcp/-/cisco-ris-mcp-1.1.4.tgz","fileCount":5,"integrity":"sha512-mTdZ/pN41+/OmwYtauYBqCiHzh6bmDj7vK+U0oqsCI15K0q49GiSkg9txKpYnmRsLXKRz/9vuX2k+wEBjbsffg==","signatures":[{"sig":"MEQCIA9goVVD5hQiKVOPn3wOO3rebdDkSj0ZzpyzkGFwNxYlAiBm05ZKfooq1ngK7eBvTw9NOyp5OW280H9nSSlMgyMSnw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145867},"main":"build/index.js","type":"module","engines":{"node":">=18"},"gitHead":"5956fed82c7d8c8da318bb87d4174dc8b07583ba","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint && yarn test","typecheck":"tsc --noEmit","semantic-release":"semantic-release"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"10.9.4","description":"MCP server for Cisco CUCM RIS (Real-time Information Service) and PerfMon APIs","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^4.3.6","fast-xml-parser":"^4.5.3","@modelcontextprotocol/sdk":"^1.27.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsx":"^4.21.0","vite":"^7.3.1","eslint":"^9.39.4","vitest":"^4.1.0","prettier":"^3.8.1","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/node":"^25.5.0","semantic-release":"^25.0.3","typescript-eslint":"^8.57.1","@vitest/coverage-v8":"^4.1.0","@semantic-release/git":"^10.0.1","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cisco-ris-mcp_1.1.4_1773846618849_0.04512374543728592","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@calltelemetry/cisco-ris-mcp","version":"1.1.5","keywords":["mcp","cisco","cucm","ris","risport","perfmon","realtime","monitoring"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-ris-mcp@1.1.5","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-ris-mcp":"build/index.js"},"dist":{"shasum":"e976cd1438ebfa629e06b13dd97c9be2a49cef0b","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-ris-mcp/-/cisco-ris-mcp-1.1.5.tgz","fileCount":5,"integrity":"sha512-uzm+Bui18YNToDmLiU7h0T4wSQr5uZg/DDYpK9VCSr/xqxhGo62zWXMCUTBqFk2mZKDYbUp1giVzCuPxx3U8uQ==","signatures":[{"sig":"MEYCIQDnFme6JwYsmlgg4a/3svvgQsZpkjWTZ3qjZ0zYUyeozwIhAMAm02F0Zw0QtmpPpXW3xfeyzs10lFMooXOGNEGBjTn/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":148011},"main":"build/index.js","type":"module","engines":{"node":">=18"},"gitHead":"b3097c2ea8335dffb5fd258c382bb41d6143b196","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint && yarn test","typecheck":"tsc --noEmit","semantic-release":"semantic-release"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"10.9.4","description":"MCP server for Cisco CUCM RIS (Real-time Information Service) and PerfMon APIs","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^4.3.6","fast-xml-parser":"^4.5.3","@modelcontextprotocol/sdk":"^1.27.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsx":"^4.21.0","vite":"^7.3.1","eslint":"^9.39.4","vitest":"^4.1.0","prettier":"^3.8.1","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/node":"^25.5.0","semantic-release":"^25.0.3","typescript-eslint":"^8.57.1","@vitest/coverage-v8":"^4.1.0","@semantic-release/git":"^10.0.1","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cisco-ris-mcp_1.1.5_1773847055432_0.8778570126097136","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@calltelemetry/cisco-ris-mcp","version":"1.2.0","keywords":["mcp","cisco","cucm","ris","risport","perfmon","realtime","monitoring"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-ris-mcp@1.2.0","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-ris-mcp":"build/index.js"},"dist":{"shasum":"282d2d8d8520227f5fa07ad3a28f0d3f69126cca","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-ris-mcp/-/cisco-ris-mcp-1.2.0.tgz","fileCount":5,"integrity":"sha512-lXslnIx1+Iabt/06HCbrubFTKLFDuDZds3xyNDTOBgS4n5ROyq5XrSoKuLR0JOxNCMRU4Y6Jt6878KCBiafjNg==","signatures":[{"sig":"MEQCIEYYBQQ+k1kpdPRombV3ZO7NBF2oYBwGac3gXDuyBNJ6AiAoKeGyCKPpBai1JBDQq8U1UvQDjTi8RUpJqjovmHc13w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152411},"main":"build/index.js","type":"module","engines":{"node":">=18"},"gitHead":"b2e1ec7f2dfd60903afc4434a96f48094ae64947","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint && yarn test","typecheck":"tsc --noEmit","semantic-release":"semantic-release"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"10.9.4","description":"MCP server for Cisco CUCM RIS (Real-time Information Service) and PerfMon APIs","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^4.3.6","fast-xml-parser":"^4.5.3","@modelcontextprotocol/sdk":"^1.27.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsx":"^4.21.0","vite":"^7.3.1","eslint":"^9.39.4","vitest":"^4.1.0","prettier":"^3.8.1","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/node":"^25.5.0","semantic-release":"^25.0.3","typescript-eslint":"^8.57.1","@vitest/coverage-v8":"^4.1.0","@semantic-release/git":"^10.0.1","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cisco-ris-mcp_1.2.0_1773847256145_0.8662594364199951","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@calltelemetry/cisco-ris-mcp","version":"1.3.0","keywords":["mcp","cisco","cucm","ris","risport","perfmon","realtime","monitoring"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-ris-mcp@1.3.0","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-ris-mcp":"build/index.js"},"dist":{"shasum":"2ffffa37d7827335fd0cea347ad03d211d91ca26","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-ris-mcp/-/cisco-ris-mcp-1.3.0.tgz","fileCount":5,"integrity":"sha512-JWQ701PizRVD/PvFGGaM7ElNTwbD1FDX3k5LGPt3m5baoo/ef38u3pYQCPR+SfTGvgZCFr1fZ53jfK7GhTwKwg==","signatures":[{"sig":"MEUCIQD8caFmniDyMvltZJFC0Q4FzCFTl1RboF6WV4CFqJih6gIgergmxr2I8jIqWam3OGMEjJCoy2Tgy7jGzdIPDr8SBLs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153039},"main":"build/index.js","type":"module","engines":{"node":">=18"},"gitHead":"b27570dec80916ebec178987651f46aa4c528bfe","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint && yarn test","typecheck":"tsc --noEmit","semantic-release":"semantic-release"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"10.9.4","description":"MCP server for Cisco CUCM RIS (Real-time Information Service) and PerfMon APIs","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^4.3.6","fast-xml-parser":"^4.5.3","@modelcontextprotocol/sdk":"^1.27.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsx":"^4.21.0","vite":"^7.3.1","eslint":"^9.39.4","vitest":"^4.1.0","prettier":"^3.8.1","@eslint/js":"^9.39.4","typescript":"^5.9.3","@types/node":"^25.5.0","semantic-release":"^25.0.3","typescript-eslint":"^8.57.1","@vitest/coverage-v8":"^4.1.0","@semantic-release/git":"^10.0.1","@semantic-release/changelog":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/cisco-ris-mcp_1.3.0_1773847907465_0.5592786820106748","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@calltelemetry/cisco-ris-mcp","version":"1.4.0","description":"MCP server for Cisco CUCM RIS (Real-time Information Service) and PerfMon APIs","type":"module","main":"build/index.js","bin":{"cisco-ris-mcp":"build/index.js"},"publishConfig":{"access":"public"},"engines":{"node":">=18"},"packageManager":"yarn@4.12.0","scripts":{"build":"vite build && chmod +x build/index.js","start":"node build/index.js","dev":"vite build --watch","typecheck":"tsc --noEmit","lint":"eslint src/ test/","lint:fix":"eslint src/ test/ --fix","test":"vitest run","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint && yarn test","prepack":"yarn build && yarn test:mcp","semantic-release":"semantic-release"},"keywords":["mcp","cisco","cucm","ris","risport","perfmon","realtime","monitoring"],"author":{"name":"CallTelemetry"},"license":"MIT","dependencies":{"@modelcontextprotocol/sdk":"^1.27.1","fast-xml-parser":"^4.5.3","zod":"^4.3.6"},"devDependencies":{"@eslint/js":"^9.39.4","@semantic-release/changelog":"^6.0.3","@semantic-release/git":"^10.0.1","@types/node":"^25.5.0","@vitest/coverage-v8":"^4.1.0","eslint":"^9.39.4","prettier":"^3.8.1","semantic-release":"^25.0.3","tsx":"^4.21.0","typescript":"^5.9.3","typescript-eslint":"^8.57.1","vite":"^7.3.1","vitest":"^4.1.0"},"_id":"@calltelemetry/cisco-ris-mcp@1.4.0","gitHead":"317f77acd23b3d1cffeaec5e94d7003ef28bc274","_nodeVersion":"22.22.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-F4P7rnMl9Jo7dALxP2Ydg/zB4GAR5yWHVbHB3w1DY0A5gTsQeNSURQ435Y38JRpLYLHit6AGmbjSVv0xQxUJBg==","shasum":"2189edea542fe32fb48dd5b5f726f0bfc5ce5ffe","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-ris-mcp/-/cisco-ris-mcp-1.4.0.tgz","fileCount":5,"unpackedSize":154806,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCrogwGub8mm1DCjW3w9ocBH67I7it2EWFiL9N2bylGuwIhAP8SIKuhzqINmyb+rnrjPPYRE+wS9Jj31BIN52NiFK9j"}]},"_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-ris-mcp_1.4.0_1773849104083_0.8723379446827362"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-18T13:48:12.321Z","modified":"2026-03-18T15:51:44.423Z","1.0.0":"2026-03-18T13:48:12.568Z","1.1.0":"2026-03-18T14:33:02.664Z","1.1.1":"2026-03-18T14:43:50.625Z","1.1.2":"2026-03-18T14:54:57.930Z","1.1.3":"2026-03-18T14:57:16.447Z","1.1.4":"2026-03-18T15:10:18.980Z","1.1.5":"2026-03-18T15:17:35.570Z","1.2.0":"2026-03-18T15:20:56.311Z","1.3.0":"2026-03-18T15:31:47.605Z","1.4.0":"2026-03-18T15:51:44.264Z"},"author":{"name":"CallTelemetry"},"license":"MIT","keywords":["mcp","cisco","cucm","ris","risport","perfmon","realtime","monitoring"],"description":"MCP server for Cisco CUCM RIS (Real-time Information Service) and PerfMon APIs","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"readme":"# @calltelemetry/cisco-ris-mcp\n\nMCP server for Cisco CUCM Real-time Information Service (RIS) and PerfMon SOAP APIs.\n\n[![npm](https://img.shields.io/npm/v/@calltelemetry/cisco-ris-mcp)](https://www.npmjs.com/package/@calltelemetry/cisco-ris-mcp)\n[![CI](https://github.com/calltelemetry/cisco-ris-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/calltelemetry/cisco-ris-mcp/actions/workflows/ci.yml)\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 access to Cisco CUCM device registration status, performance counters, and cluster health — via the RIS and PerfMon SOAP APIs.\n\n**You ask about your cluster in plain language. The LLM queries RIS and PerfMon for you.**\n\n### Troubleshooting & Triage\n- *\"Are all phones registered? Which ones aren't?\"*\n- *\"Find all phones on subnet 10.1.5.x — are any unregistered?\"*\n- *\"Is SEP001122334455 registered? What node is it on? What's its IP?\"*\n- *\"Show me all rejected phones and their rejection reasons\"*\n- *\"Which CUCM node has the most unregistered devices?\"*\n\n### Capacity & Performance\n- *\"Show me call volume over the last 5 minutes\"*\n- *\"How many MTP and transcoder resources are available?\"*\n- *\"Are we running low on conference bridge resources?\"*\n- *\"What's the CPU utilization on the publisher?\"*\n- *\"Monitor SIP trunk call activity for the next 2 minutes\"*\n\n### Health & Situational Awareness\n- *\"Is the cluster healthy?\"*\n- *\"Give me a registration breakdown by protocol — how many SIP vs SCCP?\"*\n- *\"How many Jabber clients are connected via MRA?\"*\n- *\"Are any CTI applications connected? What's their status?\"*\n- *\"Compare registration counts to what CUCM thinks is registered via PerfMon\"*\n\n### Usage Collection & Trending\n- *\"Monitor call volume for the next 5 minutes and show me the trend\"*\n- *\"Track registration changes — are phones dropping off?\"*\n- *\"Collect CPU samples every 10 seconds and graph the usage\"*\n- *\"Start monitoring SIP trunk activity while I make test calls\"*\n- *\"How is MTP utilization trending during business hours?\"*\n\nResults include **Unicode sparklines** for visual trending:\n```\nCallsActive      ▁▁▂▃▅▇█▇▅▃▂▁  min=0 max=47 avg=18.3\nCallsCompleted   ▁▂▃▄▅▆▇█▇▇██  delta=234 rate=3.9/s\nRegisteredPhones ████████████▇  min=847 max=850 avg=849\n```\n\n### Inventory & Reporting\n- *\"How many phones are registered by model/firmware?\"*\n- *\"List all registered hardware phones and their IPs\"*\n- *\"What PerfMon counters are available on this cluster?\"*\n- *\"Show me all instances of Cisco SIP trunk counters\"*\n\n## Installation\n\nNo install required — npx downloads and runs automatically:\n\n```bash\nnpx @calltelemetry/cisco-ris-mcp\n```\n\n## What It Does\n\n- **Device registration** — Query real-time phone, gateway, and CTI device status with wildcard search, model/protocol filtering, and auto-pagination across cluster nodes\n- **Performance counters** — Snapshot or continuously monitor PerfMon counters (calls active, registration counts, SIP stats, CPU) with built-in presets for common scenarios\n- **Cluster health** — Single-call health check combining RIS device registration + PerfMon counters with configurable threshold alerts\n\n## Tools\n\n| Tool | Description |\n|------|-------------|\n| `device_status` | Query real-time device registration with wildcard search and auto-pagination |\n| `phone_summary` | Dashboard-ready registration summary with aggregate counts by model, protocol, and node |\n| `cti_status` | Query CTI port, route point, and application connection status |\n| `registration_health` | Cluster-wide health check combining RIS + PerfMon with threshold alerts |\n| `counter_snapshot` | One-shot PerfMon counter read with preset support |\n| `counter_list` | Discover available PerfMon counter objects and their counters |\n| `counter_instances` | List instances of a multi-instance PerfMon object |\n| `counter_monitor_start` | Start background counter monitoring at a configurable interval |\n| `counter_monitor_results` | Read accumulated samples with min/max/avg/delta/rate statistics |\n| `counter_monitor_stop` | Stop a running monitor and return final statistics |\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Required | Default | Description |\n|----------|----------|---------|-------------|\n| `CUCM_HOST` | Yes | — | CUCM publisher hostname or IP |\n| `CUCM_USERNAME` | Yes | — | CUCM admin username |\n| `CUCM_PASSWORD` | Yes | — | CUCM admin password |\n| `CUCM_PORT` | No | `8443` | CUCM HTTPS port |\n| `RIS_MCP_LOG_LEVEL` | No | `warn` | Log level: `debug`, `info`, `warn`, `error` |\n| `RIS_MCP_TLS_MODE` | No | `permissive` | Set to `strict` to reject self-signed certs |\n\nAll 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.\n\n### Counter Presets\n\nPresets select a curated set of counters for common monitoring scenarios:\n\n| Preset | PerfMon Object | Counters |\n|--------|----------------|----------|\n| `registration` | Cisco CallManager | RegisteredHardwarePhones, RegisteredOtherStationDevices, PartiallyRegisteredPhone |\n| `call_processing` | Cisco CallManager | CallsActive, CallsAttempted, CallsCompleted |\n| `sip` | Cisco SIP | All SIP stack counters (INVITE, BYE, REGISTER, etc.) |\n| `media` | Cisco CallManager | VideoCallsActive, VideoCallsCompleted |\n| `system` | Processor | All processor/CPU counters |\n\n## Tool Examples\n\nAll examples below are from a live CUCM 15.0 cluster.\n\n---\n\n### `phone_summary` — Registration overview\n\nReturns aggregate counts by model, protocol, and cluster node. Ideal for dashboards.\n\n**Input:**\n\n```json\n{ \"summaryOnly\": true }\n```\n\n**Output:**\n\n```json\n{\n  \"totalDevices\": 1,\n  \"registered\": 1,\n  \"unregistered\": 0,\n  \"registrationRate\": 100,\n  \"byModel\": {\n    \"SCCP75.9-4-2SR4-3S\": { \"registered\": 1, \"unregistered\": 0 }\n  },\n  \"byProtocol\": {\n    \"SCCP\": { \"registered\": 1, \"unregistered\": 0 }\n  },\n  \"byNode\": [\n    { \"name\": \"cucm15-pub\", \"registered\": 1, \"unregistered\": 0, \"total\": 1 }\n  ]\n}\n```\n\n---\n\n### `device_status` — Search specific devices\n\nQuery device registration by name pattern with full per-device detail.\n\n**Input:**\n\n```json\n{ \"query\": \"SEP*\" }\n```\n\n**Output (all fields from CUCM SOAP response, strongly typed):**\n\n```json\n{\n  \"totalDevicesFound\": 1,\n  \"cmNodes\": [\n    {\n      \"name\": \"cucm15-pub\",\n      \"returnCode\": \"Ok\",\n      \"devices\": [\n        {\n          \"name\": \"SEP0022905C7710\",\n          \"ipAddress\": \"10.0.0.178\",\n          \"ipAddrType\": \"ipv4\",\n          \"ipAttribute\": \"AdministrativeAndSignaling\",\n          \"description\": \"Auto 1000 7975 Phone3\",\n          \"dirNumber\": \"1000-Registered\",\n          \"status\": \"Registered\",\n          \"statusReason\": 0,\n          \"protocol\": \"SCCP\",\n          \"deviceClass\": \"Phone\",\n          \"model\": 437,\n          \"product\": 336,\n          \"httpd\": \"Yes\",\n          \"registrationAttempts\": 1,\n          \"isCtiControllable\": true,\n          \"loginUserId\": \"\",\n          \"numOfLines\": 1,\n          \"linesStatus\": [\n            { \"directoryNumber\": \"1000\", \"status\": \"Registered\" }\n          ],\n          \"activeLoadId\": \"SCCP75.9-4-2SR4-3S\",\n          \"inactiveLoadId\": \"\",\n          \"downloadStatus\": \"Unknown\",\n          \"downloadFailureReason\": \"\",\n          \"downloadServer\": \"\",\n          \"timeStamp\": 1773835197\n        }\n      ]\n    }\n  ]\n}\n```\n\n---\n\n### `registration_health` — Cluster health check\n\nSingle call combining RIS registration data + PerfMon counters with threshold-based alerts.\n\n**Input:**\n\n```json\n{}\n```\n\n**Output:**\n\n```json\n{\n  \"overall\": {\n    \"registrationRate\": 100,\n    \"totalDevices\": 1,\n    \"registered\": 1,\n    \"unregistered\": 0\n  },\n  \"nodes\": [\n    { \"name\": \"cucm15-pub\", \"registrationRate\": 100, \"registered\": 1, \"unregistered\": 0 }\n  ],\n  \"counters\": {\n    \"CallsActive\": 0,\n    \"RegisteredHardwarePhones\": 1,\n    \"CallManagerHeartBeat\": 4958,\n    \"InitializationState\": 100\n  },\n  \"alerts\": []\n}\n```\n\nAn empty `alerts` array means the cluster is healthy. When thresholds are breached (e.g., registration rate drops below 90%), alerts describe the condition.\n\n---\n\n### `counter_snapshot` — One-shot counter read\n\nRead PerfMon counters using a preset or custom object/counter list.\n\n**Input (registration preset):**\n\n```json\n{ \"preset\": \"registration\" }\n```\n\n**Output:**\n\n```json\n{\n  \"object\": \"Cisco CallManager\",\n  \"host\": \"10.0.0.1\",\n  \"counters\": [\n    { \"name\": \"RegisteredHardwarePhones\", \"value\": 1, \"cStatus\": 1 },\n    { \"name\": \"RegisteredOtherStationDevices\", \"value\": 0, \"cStatus\": 1 },\n    { \"name\": \"PartiallyRegisteredPhone\", \"value\": 0, \"cStatus\": 1 }\n  ]\n}\n```\n\n**Input (call processing preset):**\n\n```json\n{ \"preset\": \"call_processing\" }\n```\n\n**Output:**\n\n```json\n{\n  \"object\": \"Cisco CallManager\",\n  \"host\": \"10.0.0.1\",\n  \"counters\": [\n    { \"name\": \"CallsActive\", \"value\": 0, \"cStatus\": 1 },\n    { \"name\": \"CallsAttempted\", \"value\": 0, \"cStatus\": 1 },\n    { \"name\": \"CallsCompleted\", \"value\": 0, \"cStatus\": 1 }\n  ]\n}\n```\n\n---\n\n### `counter_list` — Discover available counters\n\nList all PerfMon objects and their counters on the cluster.\n\n**Input:**\n\n```json\n{}\n```\n\n**Output (truncated):**\n\n```json\n[\n  {\n    \"objectName\": \"Cisco CAR DB\",\n    \"multiInstance\": true,\n    \"counters\": [\"CARDBSpaceUsed\", \"CARTempDBSpaceUsed\", \"FreeSharedMemory\", \"RootDBSpaceUsed\", \"UsedSharedMemory\"]\n  },\n  {\n    \"objectName\": \"Cisco CallManager\",\n    \"multiInstance\": false,\n    \"counters\": [\"CallsActive\", \"CallsAttempted\", \"CallsCompleted\", \"RegisteredHardwarePhones\", \"...120 more\"]\n  },\n  {\n    \"objectName\": \"Cisco SIP Stack\",\n    \"multiInstance\": false,\n    \"counters\": [\"InviteIns\", \"InviteOuts\", \"RegisterIns\", \"ByeIns\", \"...150 more\"]\n  }\n]\n```\n\n---\n\n### `counter_instances` — List multi-instance object entries\n\nDiscover which devices, lines, or resources exist as instances of a PerfMon object.\n\n**Input:**\n\n```json\n{ \"object\": \"Cisco Phones\" }\n```\n\n**Output:**\n\n```json\n{\n  \"object\": \"Cisco Phones\",\n  \"instances\": [\"SEP0022905C7710\"]\n}\n```\n\n---\n\n### `counter_monitor_start` — Background monitoring\n\nStart continuous counter collection at a configurable interval. Returns a `monitorId` for retrieving results.\n\n**Input:**\n\n```json\n{\n  \"object\": \"Cisco CallManager\",\n  \"counters\": [\"CallsActive\", \"CallsAttempted\", \"CallsCompleted\"],\n  \"intervalMs\": 10000,\n  \"maxSamples\": 100\n}\n```\n\n**Output:**\n\n```json\n{\n  \"monitorId\": \"mon-1710756000-abc123\",\n  \"status\": \"running\",\n  \"object\": \"Cisco CallManager\",\n  \"counters\": [\"CallsActive\", \"CallsAttempted\", \"CallsCompleted\"],\n  \"intervalMs\": 10000,\n  \"maxSamples\": 100,\n  \"message\": \"Monitor started. Use counter_monitor_results to read samples, counter_monitor_stop to end.\"\n}\n```\n\n---\n\n### `counter_monitor_results` — Read accumulated statistics\n\nRetrieve samples from a running or completed monitor with computed statistics per counter.\n\n**Input:**\n\n```json\n{ \"monitorId\": \"mon-1773846059140-5md4o5\" }\n```\n\n**Output (includes Unicode sparklines for visual trending):**\n\n```json\n{\n  \"monitorId\": \"mon-1773846059140-5md4o5\",\n  \"status\": \"running\",\n  \"samplesCollected\": 10,\n  \"maxSamples\": 100,\n  \"durationMs\": 100000,\n  \"stats\": [\n    {\n      \"name\": \"CallsActive\",\n      \"type\": \"gauge\",\n      \"sparkline\": \"▁▂▃▅▇█▇▅▃▁\",\n      \"min\": 0, \"max\": 47, \"avg\": 18.3,\n      \"delta\": 0, \"rate\": 0, \"latest\": 2\n    },\n    {\n      \"name\": \"CallsCompleted\",\n      \"type\": \"counter\",\n      \"sparkline\": \"▁▂▃▄▅▆▆▇▇█\",\n      \"min\": 1200, \"max\": 1438, \"avg\": 1319,\n      \"delta\": 238, \"rate\": 2.38, \"latest\": 1438\n    }\n  ]\n}\n```\n\nStatistics use **actual timestamps** (not assumed intervals) for rate calculation. Counters are classified as:\n- **gauge** (CallsActive, RegisteredHardwarePhones) — min/max/avg are meaningful\n- **counter** (CallsCompleted, CallsAttempted) — delta and rate (per second) are meaningful\n\nResults remain available for 30 minutes after a monitor completes or is stopped.\n\n---\n\n### `counter_monitor_stop` — Stop and finalize\n\nStops a running monitor, closes the PerfMon session on CUCM, and returns final statistics.\n\n**Input:**\n\n```json\n{ \"monitorId\": \"mon-1773846059140-5md4o5\" }\n```\n\n**Output:**\n\n```json\n{\n  \"monitorId\": \"mon-1773846059140-5md4o5\",\n  \"status\": \"completed\",\n  \"samplesCollected\": 10,\n  \"durationMs\": 100000,\n  \"stats\": [\n    { \"name\": \"CallsActive\", \"type\": \"gauge\", \"sparkline\": \"▁▂▃▅▇█▇▅▃▁\", \"min\": 0, \"max\": 47, \"avg\": 18.3, \"latest\": 2 },\n    { \"name\": \"CallsCompleted\", \"type\": \"counter\", \"sparkline\": \"▁▂▃▄▅▆▆▇▇█\", \"delta\": 238, \"rate\": 2.38, \"latest\": 1438 }\n  ]\n}\n```\n\n---\n\n## MCP Configuration\n\n### Claude Code (one-liner)\n\n```bash\nclaude mcp add cucm_ris \\\n  -e CUCM_HOST=cucm-pub.example.com \\\n  -e CUCM_USERNAME=admin \\\n  -e CUCM_PASSWORD=secret \\\n  -- npx @calltelemetry/cisco-ris-mcp\n```\n\n### mcp.json\n\n```json\n{\n  \"mcpServers\": {\n    \"cucm-ris\": {\n      \"command\": \"npx\",\n      \"args\": [\"@calltelemetry/cisco-ris-mcp\"],\n      \"env\": {\n        \"CUCM_HOST\": \"cucm-pub.example.com\",\n        \"CUCM_USERNAME\": \"admin\",\n        \"CUCM_PASSWORD\": \"secret\"\n      }\n    }\n  }\n}\n```\n\n## Architecture\n\n- **SOAP client** — Wraps the RIS `selectCmDevice` and PerfMon `perfmonCollectCounterData` / `perfmonListCounter` SOAP endpoints\n- **Rate limiter** — Prevents overloading CUCM with concurrent RIS/PerfMon requests\n- **TTL cache** — Caches counter metadata and device queries to reduce SOAP round-trips\n- **Background monitoring** — In-memory poll loop for `counter_monitor_*` tools with automatic sample collection\n- **Structured errors** — All failures return typed error objects with CUCM-specific context\n\n## Development\n\n```bash\nyarn install        # Install dependencies\nyarn build          # Build with Vite\nyarn dev            # Watch mode\nyarn typecheck      # Type check\nyarn lint           # Lint\nyarn test           # Run tests\nyarn validate       # typecheck + lint + test\n```\n\n## Related\n\n| Server | Description |\n|--------|-------------|\n| **[cisco-axl-mcp](https://github.com/calltelemetry/cisco-axl-mcp)** | CUCM provisioning and admin via AXL SOAP API |\n| **[cisco-cucm-mcp](https://github.com/calltelemetry/cisco-cucm-mcp)** | CUCM operational debugging — logs, traces, packet capture, service control |\n\n## License\n\nMIT\n","readmeFilename":"README.md"}