{"_id":"@calltelemetry/cisco-axl-mcp","_rev":"13-82c81c46c5f06acd6df32b776f976094","name":"@calltelemetry/cisco-axl-mcp","dist-tags":{"latest":"0.8.0"},"versions":{"0.1.0":{"name":"@calltelemetry/cisco-axl-mcp","version":"0.1.0","keywords":["mcp","cisco","cucm","axl","soap"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-axl-mcp@0.1.0","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-axl-mcp":"build/index.js"},"dist":{"shasum":"f0403666b1b844e23847d08fd67ecc87994b25f4","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-axl-mcp/-/cisco-axl-mcp-0.1.0.tgz","fileCount":5,"integrity":"sha512-T+EeO1qeB91ghouMiZzN8/K46KHgWIMKnXooJ4lRakj0cnDoDKOrRg0W1KmzhjwCqfIbhGsi4L6L52kn1KwhEQ==","signatures":[{"sig":"MEQCIChmRTTI1LTVkIDK3++bjNZLuDR0FVR97rboixyZMWOXAiAC8QyhABNalQHwApwTp4mzwEUfbvN6m0+D204LD348hg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195538},"main":"build/index.js","type":"module","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/ scripts/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ scripts/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint --max-warnings=50 && yarn test","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","print:objects":"node -e \"const fs=require('fs'); console.log(fs.readFileSync('generated/axl-top-level-objects.json','utf8'))\"","generate:types":"tsx scripts/generate-types.ts"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"11.7.0","description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","directories":{},"_nodeVersion":"24.12.0","dependencies":{"dotenv":"^17.2.3","cisco-axl":"^1.4.1","typescript":"^5.0.0","@types/node":"^25.0.9","strong-soap":"^4.1.5","@modelcontextprotocol/sdk":"^1.25.2"},"publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","vite":"^7.3.1","eslint":"^9.28.0","vitest":"^4.0.17","prettier":"^3.5.3","@eslint/js":"^9.28.0","typescript-eslint":"^8.34.0","@vitest/coverage-v8":"^4.0.17"},"peerDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cisco-axl-mcp_0.1.0_1770174582769_0.27207876780061135","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@calltelemetry/cisco-axl-mcp","version":"0.1.1","keywords":["mcp","cisco","cucm","axl","soap"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-axl-mcp@0.1.1","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-axl-mcp":"build/index.js"},"dist":{"shasum":"00923f614a6b7db54f60a78bbd2afe9f4a9352f1","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-axl-mcp/-/cisco-axl-mcp-0.1.1.tgz","fileCount":5,"integrity":"sha512-eYxtQAuWQJuEJI6i2OrDtlQPiNBsBtuxUiUjNW0Om+jTvd8oF4+5wBchSYvYAC/uZTXpnRQorMKaptcGAg+JFw==","signatures":[{"sig":"MEUCIQCBusK3xBmWHo6ldwOGTv+uk+xpmpAFK7GpyFYb47CgAAIgERPDI9nVRLJeH/kEPwc0oLnSbPb6v/DK3WrW+jVt8yg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195945},"main":"build/index.js","type":"module","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/ scripts/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ scripts/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint --max-warnings=50 && yarn test","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","print:objects":"node -e \"const fs=require('fs'); console.log(fs.readFileSync('generated/axl-top-level-objects.json','utf8'))\"","generate:types":"tsx scripts/generate-types.ts"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"11.7.0","description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","directories":{},"_nodeVersion":"24.12.0","dependencies":{"dotenv":"^17.2.3","cisco-axl":"^1.4.1","typescript":"^5.0.0","@types/node":"^25.0.9","strong-soap":"^4.1.5","@modelcontextprotocol/sdk":"^1.25.2"},"publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","vite":"^7.3.1","eslint":"^9.28.0","vitest":"^4.0.17","prettier":"^3.5.3","@eslint/js":"^9.28.0","typescript-eslint":"^8.34.0","@vitest/coverage-v8":"^4.0.17"},"peerDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cisco-axl-mcp_0.1.1_1770174839152_0.4156270051641031","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@calltelemetry/cisco-axl-mcp","version":"0.2.0","keywords":["mcp","cisco","cucm","axl","soap"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-axl-mcp@0.2.0","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-axl-mcp":"build/index.js"},"dist":{"shasum":"3364b292b63ac9651ba02f06a955b96919ae0a56","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-axl-mcp/-/cisco-axl-mcp-0.2.0.tgz","fileCount":5,"integrity":"sha512-tdmCnuwf8z7v0VeY8GXrnUrM5OFkOKsUuUDVoZdoBQaLiiFzLmEOalejGVWONIlK4asSA/6KtAXm98A08EPz+Q==","signatures":[{"sig":"MEUCIGUat1v7/KeDjOVqB6UzpB4CfqVtgAxTIJCOw20cC9ssAiEA6oIug7pEcT3MnzI/EBhRDY7zC9yY7L2tNuEoOSzbJoc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196869},"main":"build/index.js","type":"module","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/ scripts/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ scripts/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint --max-warnings=50 && yarn test","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","print:objects":"node -e \"const fs=require('fs'); console.log(fs.readFileSync('generated/axl-top-level-objects.json','utf8'))\"","generate:types":"tsx scripts/generate-types.ts"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"11.7.0","description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","directories":{},"_nodeVersion":"24.12.0","dependencies":{"dotenv":"^17.2.3","cisco-axl":"^1.4.1","typescript":"^5.0.0","@types/node":"^25.0.9","strong-soap":"^4.1.5","@modelcontextprotocol/sdk":"^1.25.2"},"publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","vite":"^7.3.1","eslint":"^9.28.0","vitest":"^4.0.17","prettier":"^3.5.3","@eslint/js":"^9.28.0","typescript-eslint":"^8.34.0","@vitest/coverage-v8":"^4.0.17"},"peerDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cisco-axl-mcp_0.2.0_1770175491665_0.5150514902528807","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@calltelemetry/cisco-axl-mcp","version":"0.2.1","keywords":["mcp","cisco","cucm","axl","soap"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-axl-mcp@0.2.1","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-axl-mcp":"build/index.js"},"dist":{"shasum":"b6d82dc412a95c4861ad262678b158197993da29","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-axl-mcp/-/cisco-axl-mcp-0.2.1.tgz","fileCount":5,"integrity":"sha512-OO7dJpM8IaYs5BMhpd73lV2pf2oWztbO1lKgX5WK0hqxHXk7UrgoXgXbpVSgK3z3HLRAnKe99vqa6wNKvAyq0w==","signatures":[{"sig":"MEUCIQClrps4ZM4ODQQ/IlPVn1pJDkXFhCliUVynT8X4C49dsgIgTyH0coITwAfMvKfZpc+3QsVSEgA4mxX9suYmQ8AMoQQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197654},"main":"build/index.js","type":"module","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/ scripts/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ scripts/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint --max-warnings=50 && yarn test","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","print:objects":"node -e \"const fs=require('fs'); console.log(fs.readFileSync('generated/axl-top-level-objects.json','utf8'))\"","generate:types":"tsx scripts/generate-types.ts"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"11.7.0","description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","directories":{},"_nodeVersion":"24.12.0","dependencies":{"dotenv":"^17.2.3","cisco-axl":"^1.4.1","typescript":"^5.0.0","@types/node":"^25.0.9","strong-soap":"^4.1.5","@modelcontextprotocol/sdk":"^1.25.2"},"publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","vite":"^7.3.1","eslint":"^9.28.0","vitest":"^4.0.17","prettier":"^3.5.3","@eslint/js":"^9.28.0","typescript-eslint":"^8.34.0","@vitest/coverage-v8":"^4.0.17"},"peerDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cisco-axl-mcp_0.2.1_1770175629769_0.06396848316346992","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@calltelemetry/cisco-axl-mcp","version":"0.3.0","keywords":["mcp","cisco","cucm","axl","soap"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-axl-mcp@0.3.0","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-axl-mcp":"build/index.js"},"dist":{"shasum":"fa3cffbff6a7513e42fd8a754769e73847660dd7","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-axl-mcp/-/cisco-axl-mcp-0.3.0.tgz","fileCount":5,"integrity":"sha512-HiDNNUVF5yg3HwAO//jjZSBmrGtmioUJrUQje5UfH09d2ImN6M7hHPO/Qao6apIqRMIs6uxBdeuC6Wd7O2+6Zg==","signatures":[{"sig":"MEUCIQDdQHAIzdt5SRTkTUsk39pzrhrxZTwplJqssFlJzquzoQIgQTdAbZlgZ+OAStnp1iN7Slj37uWDCL5vlfLBgHMN1JI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199061},"main":"build/index.js","type":"module","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/ scripts/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ scripts/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint --max-warnings=50 && yarn test","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","print:objects":"node -e \"const fs=require('fs'); console.log(fs.readFileSync('generated/axl-top-level-objects.json','utf8'))\"","generate:types":"tsx scripts/generate-types.ts"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"11.7.0","description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","directories":{},"_nodeVersion":"24.12.0","dependencies":{"dotenv":"^17.2.3","cisco-axl":"^1.4.1","typescript":"^5.0.0","@types/node":"^25.0.9","strong-soap":"^4.1.5","@modelcontextprotocol/sdk":"^1.25.2"},"publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","vite":"^7.3.1","eslint":"^9.28.0","vitest":"^4.0.17","prettier":"^3.5.3","@eslint/js":"^9.28.0","typescript-eslint":"^8.34.0","@vitest/coverage-v8":"^4.0.17"},"peerDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cisco-axl-mcp_0.3.0_1770175853213_0.49409454200380565","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@calltelemetry/cisco-axl-mcp","version":"0.3.1","keywords":["mcp","cisco","cucm","axl","soap"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-axl-mcp@0.3.1","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-axl-mcp":"build/index.js"},"dist":{"shasum":"feed4bb29af5e763f940d087d0b8baa4aa56fbb6","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-axl-mcp/-/cisco-axl-mcp-0.3.1.tgz","fileCount":5,"integrity":"sha512-YY2jK27qIIQWHnR2K0WmsI98Bf5KxyfMvoCPFSNM3Q6fdwoBZIE0aXSWKE+bhlv0iqkx1cWn3CNDSiKOhHCfFQ==","signatures":[{"sig":"MEYCIQDMBcOkNmzJqVlJh/SwYoa8rvsgh0aptiJkZkf+FyiWJgIhAJh3kfAsTXhWxYIVxj2u0HOTI5PL7cYvGJeOhCiouyAy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199498},"main":"build/index.js","type":"module","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/ scripts/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ scripts/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint --max-warnings=50 && yarn test","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","print:objects":"node -e \"const fs=require('fs'); console.log(fs.readFileSync('generated/axl-top-level-objects.json','utf8'))\"","generate:types":"tsx scripts/generate-types.ts"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"11.7.0","description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","directories":{},"_nodeVersion":"24.12.0","dependencies":{"dotenv":"^17.2.3","cisco-axl":"^1.4.1","typescript":"^5.0.0","@types/node":"^25.0.9","strong-soap":"^4.1.5","@modelcontextprotocol/sdk":"^1.25.2"},"publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","vite":"^7.3.1","eslint":"^9.28.0","vitest":"^4.0.17","prettier":"^3.5.3","@eslint/js":"^9.28.0","typescript-eslint":"^8.34.0","@vitest/coverage-v8":"^4.0.17"},"peerDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cisco-axl-mcp_0.3.1_1770176358881_0.9704769203054782","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@calltelemetry/cisco-axl-mcp","version":"0.4.0","keywords":["mcp","cisco","cucm","axl","soap"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-axl-mcp@0.4.0","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-axl-mcp":"build/index.js"},"dist":{"shasum":"e058111a46967567db054443fefbe153f9bb271b","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-axl-mcp/-/cisco-axl-mcp-0.4.0.tgz","fileCount":5,"integrity":"sha512-Ktg74gfnHCskRFgHQVRCV2xIUpHK4a3w+ugBnn0uj5xjitfaeo77FU3EkmAe8JWNNoov4c0+YtkHS5jgRJ/Odg==","signatures":[{"sig":"MEUCIQCpLUM4htRaYdLKc3Urt8Dud9WQHJ6xehL3SRGPj+D75wIgDnSFPk8sMd5BZ2EtKPm+Atxplv0IIGMTkGD09datCcM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6704852},"main":"build/index.js","type":"module","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/ scripts/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ scripts/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint --max-warnings=50 && yarn test","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","print:objects":"node -e \"const fs=require('fs'); console.log(fs.readFileSync('generated/axl-top-level-objects.json','utf8'))\"","generate:types":"tsx scripts/generate-types.ts"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"11.7.0","description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","directories":{},"_nodeVersion":"24.12.0","dependencies":{"dotenv":"^17.2.3","cisco-axl":"^1.4.1","typescript":"^5.0.0","@types/node":"^25.0.9","strong-soap":"^4.1.5","@modelcontextprotocol/sdk":"^1.25.2"},"publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.6","vite":"^7.3.1","eslint":"^9.28.0","vitest":"^4.0.17","prettier":"^3.5.3","@eslint/js":"^9.28.0","typescript-eslint":"^8.34.0","@vitest/coverage-v8":"^4.0.17"},"peerDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cisco-axl-mcp_0.4.0_1770177984727_0.8403992964256362","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@calltelemetry/cisco-axl-mcp","version":"0.4.2","keywords":["mcp","cisco","cucm","axl","soap"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-axl-mcp@0.4.2","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-axl-mcp":"build/index.js"},"dist":{"shasum":"83f1da041ce6c81e9fd9921dbfda80505c47509b","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-axl-mcp/-/cisco-axl-mcp-0.4.2.tgz","fileCount":5,"integrity":"sha512-aWzWZEHGVAPsfO+4bYmFEMEjFX+NwzGeRPP96qQrSlj/0Z2V1CG/nh+Yr/IiGmvJ+2DNydQmHHfzJL+sSDDqMg==","signatures":[{"sig":"MEUCIQD25ezWtY8t7n4Raq8EBai+iwvB+wX/emo+wWN5i/b2ZwIgA1jFCnpnV2rFwpO7KlyXx0QQL7/T0iRFQ4/JWkJmQvw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6705197},"main":"build/index.js","type":"module","gitHead":"d343160d76330ca0777af0c57fe88907a4bb804d","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/ scripts/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ scripts/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint --max-warnings=50 && yarn test","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","print:objects":"node -e \"const fs=require('fs'); console.log(fs.readFileSync('generated/axl-top-level-objects.json','utf8'))\"","generate:types":"tsx scripts/generate-types.ts"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"10.9.4","description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","directories":{},"_nodeVersion":"22.22.0","dependencies":{"zod":"^4.3.6","dotenv":"17.3.1","cisco-axl":"1.4.1","typescript":"5.8.2","@types/node":"25.3.2","strong-soap":"4.1.14","@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.3","vitest":"4.0.18","prettier":"3.8.1","@eslint/js":"9.39.3","typescript-eslint":"8.56.1","@vitest/coverage-v8":"4.0.18"},"peerDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cisco-axl-mcp_0.4.2_1772218410443_0.2529681072083787","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@calltelemetry/cisco-axl-mcp","version":"0.5.0","keywords":["mcp","cisco","cucm","axl","soap"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-axl-mcp@0.5.0","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-axl-mcp":"build/index.js"},"dist":{"shasum":"d6f551828747cf4501250a53de1da88b43135296","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-axl-mcp/-/cisco-axl-mcp-0.5.0.tgz","fileCount":5,"integrity":"sha512-YXXX40VqwV0U4x4nTWjsRE+48jmZs+T7e5ssHLNjY5PowRYlJ3PDIA8Wq1j2BJJ1f5hzJPhtENWFdorIREeFNg==","signatures":[{"sig":"MEQCIBjjB33QtSpnMfH70Fu4zU/LG5CUgOhIiGKQSwdlwudYAiB2agf30zkLg+Zio5PlatGCMqL4R1Iqr7/8WUDIjFjIcg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6911967},"main":"build/index.js","type":"module","gitHead":"059d3dfeb4df50a74645a177c4a7902cbdfe3fec","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/ scripts/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ scripts/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint --max-warnings=50 && yarn test","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","print:objects":"node -e \"const fs=require('fs'); console.log(fs.readFileSync('generated/axl-top-level-objects.json','utf8'))\"","generate:types":"tsx scripts/generate-types.ts"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"10.9.4","description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^4.3.6","dotenv":"^17.3.1","cisco-axl":"^1.4.1","typescript":"^5.9.3","@types/node":"^25.5.0","strong-soap":"^4.1.14","@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-eslint":"^8.57.1","@vitest/coverage-v8":"^4.1.0"},"peerDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cisco-axl-mcp_0.5.0_1773753593388_0.8744243253926982","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@calltelemetry/cisco-axl-mcp","version":"0.5.1","keywords":["mcp","cisco","cucm","axl","soap"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-axl-mcp@0.5.1","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"bin":{"cisco-axl-mcp":"build/index.js"},"dist":{"shasum":"ec9d6ba33dad79dc20a728a0d21bc58c7a794e24","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-axl-mcp/-/cisco-axl-mcp-0.5.1.tgz","fileCount":5,"integrity":"sha512-d67ER+AKEhFnMQPex0IeoL91IEYb/EQzUBmp+pLLwW98NvSkJeRs02v0DYY/cJkVocS1IIN+9NgGjphRJ0YLxQ==","signatures":[{"sig":"MEUCIGzPmGvYRNBsRJzz3hBqId4LoMMz6OLVdECof4ALQ0JvAiEAmF3np2RJuoyyoTecW/rFpHRv9cfqkXhlnGDOmamaW+0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6912220},"main":"build/index.js","type":"module","gitHead":"11416f4d0a816d73ed8006a1b3723875182bc558","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/ scripts/","test":"vitest run","build":"vite build && chmod +x build/index.js","start":"node build/index.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ scripts/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint --max-warnings=50 && yarn test","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","print:objects":"node -e \"const fs=require('fs'); console.log(fs.readFileSync('generated/axl-top-level-objects.json','utf8'))\"","generate:types":"tsx scripts/generate-types.ts"},"_npmUser":{"name":"jasonbarbee","email":"jason.barbee@gmail.com"},"_npmVersion":"11.11.1","description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","directories":{},"_nodeVersion":"22.22.1","dependencies":{"zod":"^4.3.6","dotenv":"^17.3.1","cisco-axl":"^1.5.0","typescript":"^5.9.3","@types/node":"^25.5.0","strong-soap":"^4.1.14","@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","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"},"peerDependencies":{"typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cisco-axl-mcp_0.5.1_1773854260069_0.9328352350363311","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@calltelemetry/cisco-axl-mcp","version":"0.6.0","keywords":["mcp","cisco","cucm","axl","soap"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-axl-mcp@0.6.0","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"homepage":"https://github.com/calltelemetry/cisco-axl-mcp#readme","bugs":{"url":"https://github.com/calltelemetry/cisco-axl-mcp/issues"},"bin":{"cisco-axl":"build/cli.js","cisco-axl-mcp":"build/index.js"},"dist":{"shasum":"25aa107f2bd886c16a05bedf67c56336374a8fb1","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-axl-mcp/-/cisco-axl-mcp-0.6.0.tgz","fileCount":22,"integrity":"sha512-Ftaihfu7vFvXWjA3oyzFPdgPC7bpZV4RhEd2e6FSxfDj0RR2aU+zSVjxswCS1W25A4vRG1dOVM92PjbcNZ2QsA==","signatures":[{"sig":"MEYCIQD2E2UcY8XSc4tmaK8Gt8tzStwypU+7ib/ALoXACb0dnAIhAKjySH/qdeHTg5Fxpk/I6OLpdHteH7b1Pfv/ZVfB2mYo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@calltelemetry%2fcisco-axl-mcp@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":90423735},"main":"build/index.js","type":"module","engines":{"npm":">=11.5.1","node":">=22.14.0"},"gitHead":"552bcd1ec9d5c29ff603e74f5ec9d104d0c85027","scripts":{"dev":"vite build --watch","lint":"eslint src/ test/ scripts/","test":"vitest run","build":"vite build && chmod 755 build/index.js build/cli.js","start":"node build/index.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ scripts/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn lint --max-warnings=50 && yarn test","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","package:smoke":"vitest run test/package-build.test.ts","print:objects":"node -e \"const fs=require('fs'); console.log(fs.readFileSync('generated/axl-top-level-objects.json','utf8'))\"","generate:types":"tsx scripts/generate-types.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2f83e06f-38b3-459b-b47c-f8ed5317dcdd"}},"repository":{"url":"git+https://github.com/calltelemetry/cisco-axl-mcp.git","type":"git"},"_npmVersion":"11.5.1","description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.4.3","dotenv":"^17.4.2","cisco-axl":"^2.1.0","@types/node":"^26.1.1","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsx":"^4.22.3","vite":"^8.0.14","eslint":"^10.4.0","vitest":"^4.1.7","prettier":"^3.8.3","@eslint/js":"^10.0.1","typescript":"^6.0.3","strong-soap":"^6.0.1","typescript-eslint":"^8.59.4","@vitest/coverage-v8":"^4.1.7"},"peerDependencies":{"typescript":"^5.0.0 || ^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cisco-axl-mcp_0.6.0_1787316993917_0.11075943100961494","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@calltelemetry/cisco-axl-mcp","version":"0.7.0","keywords":["mcp","cisco","cucm","axl","soap"],"author":{"name":"CallTelemetry"},"license":"MIT","_id":"@calltelemetry/cisco-axl-mcp@0.7.0","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"homepage":"https://github.com/calltelemetry/cisco-axl-mcp#readme","bugs":{"url":"https://github.com/calltelemetry/cisco-axl-mcp/issues"},"bin":{"cisco-axl-mcp":"build/index.js","cisco-axl-mcp-cli":"build/cli.js"},"dist":{"shasum":"cfa970cf630b2b3fdaca708eeaa45a3dbe40d5e1","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-axl-mcp/-/cisco-axl-mcp-0.7.0.tgz","fileCount":17,"integrity":"sha512-x0nTIIuPzWL7r6BeYBHAm6zzEYpxeb2vBadQTT/aGdmLuIUx1qWXDV5oPJsjaxV8Xjn97g2ctS60m/LpTnzA/A==","signatures":[{"sig":"MEUCIBDRGOj23xFCw4OyGAoXqTfeMEeG4D5tfQxihiM4skNPAiEAk+I9H8N48kxKXrJb/oZnizr/xiU1Y7UpROY8+iWjITs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@calltelemetry%2fcisco-axl-mcp@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":29778487},"type":"module","engines":{"node":">=22.14.0"},"gitHead":"ae687f63d1a38b7b0d97485ef6f2bb986ab978c8","scripts":{"dev":"vite build --watch --mode development","lint":"eslint src/ test/ scripts/","test":"vitest run","build":"vite build && chmod 755 build/index.js build/cli.js","start":"node build/index.js","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","prepack":"yarn build && yarn test:mcp","lint:fix":"eslint src/ test/ scripts/ --fix","test:mcp":"vitest run test/mcp-conformance.test.ts","validate":"yarn typecheck && yarn format:check && yarn lint --max-warnings=0 && yarn vitest run --coverage && yarn build && yarn package:smoke","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","package:smoke":"vitest run test/package-build.test.ts","print:objects":"node -e \"const fs=require('fs'); console.log(fs.readFileSync('generated/axl-top-level-objects.json','utf8'))\"","generate:types":"tsx scripts/generate-types.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2f83e06f-38b3-459b-b47c-f8ed5317dcdd"}},"repository":{"url":"git+https://github.com/calltelemetry/cisco-axl-mcp.git","type":"git"},"_npmVersion":"11.5.1","description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","directories":{},"_nodeVersion":"22.14.0","dependencies":{"zod":"^4.4.3","dotenv":"^17.4.2","cisco-axl":"^2.1.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@4.12.0","devDependencies":{"tsx":"^4.22.3","vite":"^8.0.14","eslint":"^10.4.0","vitest":"^4.1.7","prettier":"^3.8.3","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^26.1.1","strong-soap":"^6.0.1","typescript-eslint":"^8.59.4","@vitest/coverage-v8":"^4.1.7"},"_npmOperationalInternal":{"tmp":"tmp/cisco-axl-mcp_0.7.0_1787360432175_0.4867923673488397","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@calltelemetry/cisco-axl-mcp","version":"0.8.0","description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","repository":{"type":"git","url":"git+https://github.com/calltelemetry/cisco-axl-mcp.git"},"type":"module","engines":{"node":">=22.14.0"},"bin":{"cisco-axl-mcp":"build/index.js","cisco-axl-mcp-cli":"build/cli.js"},"publishConfig":{"access":"public"},"scripts":{"generate:types":"tsx scripts/generate-types.ts","print:objects":"node -e \"const fs=require('fs'); console.log(fs.readFileSync('generated/axl-top-level-objects.json','utf8'))\"","build":"vite build && chmod 755 build/index.js build/cli.js","start":"node build/index.js","dev":"vite build --watch --mode development","typecheck":"tsc --noEmit","lint":"eslint src/ test/ scripts/","lint:fix":"eslint src/ test/ scripts/ --fix","format":"prettier --write 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","format:check":"prettier --check 'src/**/*.ts' 'test/**/*.ts' 'scripts/**/*.ts'","test":"vitest run","test:mcp":"vitest run test/mcp-conformance.test.ts","package:smoke":"vitest run test/package-build.test.ts","validate":"yarn typecheck && yarn format:check && yarn lint --max-warnings=0 && yarn vitest run --coverage && yarn build && yarn package:smoke","prepack":"yarn build && yarn test:mcp"},"keywords":["mcp","cisco","cucm","axl","soap"],"author":{"name":"CallTelemetry"},"license":"MIT","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","cisco-axl":"^2.1.0","dotenv":"^17.4.2","zod":"^4.4.3"},"devDependencies":{"@eslint/js":"^10.0.1","@types/node":"^26.1.1","@vitest/coverage-v8":"^4.1.7","eslint":"^10.4.0","prettier":"^3.8.3","strong-soap":"^6.0.1","tsx":"^4.22.3","typescript":"^6.0.3","typescript-eslint":"^8.59.4","vite":"^8.0.14","vitest":"^4.1.7"},"packageManager":"yarn@4.12.0","_id":"@calltelemetry/cisco-axl-mcp@0.8.0","gitHead":"a91f1d3da7877b5713f5aca52fda513d6e06c7e9","bugs":{"url":"https://github.com/calltelemetry/cisco-axl-mcp/issues"},"homepage":"https://github.com/calltelemetry/cisco-axl-mcp#readme","_nodeVersion":"22.14.0","_npmVersion":"11.5.1","dist":{"integrity":"sha512-nmxwBdh/AALf6nlMjaX/xtvuGTbZpczd2fglJZjfhqZPdgfrYnWFM4kKRr8XxyfVIm8EgVztokwmgwE/ouORyA==","shasum":"21748a65d579a0377cc03845b27cada4f9ec33aa","tarball":"https://registry.npmjs.org/@calltelemetry/cisco-axl-mcp/-/cisco-axl-mcp-0.8.0.tgz","fileCount":19,"unpackedSize":29803420,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@calltelemetry%2fcisco-axl-mcp@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDVuTt3uIGkH7g9B2RmqoeWhX4v1WgYN4UOc0efNX85OQIhAJCLf31MmFOv7OjT2Lj9tKi/Uaqvm0VYdnANN6vQhkPj"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2f83e06f-38b3-459b-b47c-f8ed5317dcdd"}},"directories":{},"maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cisco-axl-mcp_0.8.0_1787584206490_0.9295724186192995"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-04T03:09:42.650Z","modified":"2026-08-24T15:10:07.146Z","0.1.0":"2026-02-04T03:09:42.920Z","0.1.1":"2026-02-04T03:13:59.318Z","0.2.0":"2026-02-04T03:24:51.825Z","0.2.1":"2026-02-04T03:27:09.931Z","0.3.0":"2026-02-04T03:30:53.356Z","0.3.1":"2026-02-04T03:39:19.055Z","0.4.0":"2026-02-04T04:06:24.887Z","0.4.2":"2026-02-27T18:53:30.622Z","0.5.0":"2026-03-17T13:19:53.549Z","0.5.1":"2026-03-18T17:17:40.217Z","0.6.0":"2026-08-21T12:56:34.152Z","0.7.0":"2026-08-22T01:00:32.362Z","0.8.0":"2026-08-24T15:10:06.741Z"},"bugs":{"url":"https://github.com/calltelemetry/cisco-axl-mcp/issues"},"author":{"name":"CallTelemetry"},"license":"MIT","homepage":"https://github.com/calltelemetry/cisco-axl-mcp#readme","keywords":["mcp","cisco","cucm","axl","soap"],"repository":{"type":"git","url":"git+https://github.com/calltelemetry/cisco-axl-mcp.git"},"description":"MCP server for Cisco CUCM AXL (SOAP) via cisco-axl","maintainers":[{"name":"jasonbarbee","email":"jason.barbee@gmail.com"}],"readme":"# cisco-axl-mcp\n\n[![CI](https://github.com/calltelemetry/cisco-axl-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/calltelemetry/cisco-axl-mcp/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/calltelemetry/cisco-axl-mcp/graph/badge.svg?token=6CFM37EMBS)](https://codecov.io/gh/calltelemetry/cisco-axl-mcp)\n[![npm](https://img.shields.io/npm/v/@calltelemetry/cisco-axl-mcp)](https://www.npmjs.com/package/@calltelemetry/cisco-axl-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 access to Cisco Unified Communications Manager (CUCM) via the AXL SOAP API.\n\n**You describe the task in plain language. The LLM figures out the AXL operations.**\n\nThe MCP server ships with pre-parsed schemas from Cisco's official AXL WSDL for every supported CUCM version (11.0, 11.5, 12.0, 12.5, 14.0, 15.0). When you set `CUCM_VERSION`, it loads the schema for **your exact version** — so the LLM only sees object types, operations, fields, and enums that actually exist on your CallManager. No guessing, no hallucinated field names, no version mismatches.\n\nEight composable tools give the LLM progressive disclosure of this schema — 232 object types, 1,065+ operations (including 123 action operations like apply, reset, restart, lock, wipe), thousands of fields — including guarded mutation preview and direct SQL access to the CUCM Informix database. The server handles auto-pagination for large result sets, retries with exponential backoff on transient failures, and maintains a per-cluster JSONL audit trail of every AXL call.\n\nInstead of hand-crafting XML payloads, you say things like:\n\n- _\"Provision 2,000 phones from this Excel spreadsheet\"_\n- _\"Audit end users and find anyone missing an associated phone device\"_\n- _\"Build a report of all 7940G phones in Device Pool Dallas-DP\"_\n- _\"Set up a hunt group for the support team with round-robin distribution\"_\n- _\"Enable Built-in Bridge on every phone in the Sales CSS\"_\n- _\"Apply config changes to all phones in Device Pool Dallas-DP\"_\n- _\"Reset every phone in the building after the firmware upgrade\"_\n- _\"Wipe a stolen Jabber client — erase all local data and credentials\"_\n\nThe LLM uses the tools below to discover the right object types, inspect required fields and valid enums, then execute the AXL operations — iterating through hundreds of records if needed.\n\n## Related Cisco MCP Servers\n\n| Server                                                                  | Description                                                                |\n| ----------------------------------------------------------------------- | -------------------------------------------------------------------------- |\n| **[cisco-axl-mcp](https://github.com/calltelemetry/cisco-axl-mcp)**     | CUCM provisioning and admin via AXL SOAP API (this repo)                   |\n| **[cisco-ris-mcp](https://github.com/calltelemetry/cisco-ris-mcp)**     | Real-time device registration, PerfMon counters, cluster health            |\n| **[cisco-phone-mcp](https://github.com/calltelemetry/cisco-phone-mcp)** | Direct IP phone control — dial, screenshot, RTP stats                      |\n| **[cisco-cucm-mcp](https://github.com/calltelemetry/cisco-cucm-mcp)**   | CUCM operational debugging — logs, traces, packet capture, service control |\n\n## What It Does\n\nExposes eight composable tools that let an LLM discover, inspect, preview, and execute CUCM operations — phones, users, line groups, hunt lists, SQL queries, and any other AXL-managed object:\n\n| Tool                         | Description                                                                                                                                                            |\n| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `axl_execute`                | Execute any AXL SOAP operation (add, get, list, update, remove, apply, reset, restart, lock, wipe, etc.). Supports `autoPage` for automatic pagination of list results |\n| `axl_preview_mutation`       | Validate an exact authorized mutation without transport and return a short-lived, single-use approval grant                                                            |\n| `axl_describe_operation`     | Describe required fields, types, and enums for an operation                                                                                                            |\n| `axl_list_objects`           | Discover available CUCM object types                                                                                                                                   |\n| `axl_list_operations`        | List CRUD and action operations for a specific object type                                                                                                             |\n| `axl_list_action_operations` | Discover all 123 non-CRUD action operations (apply, reset, restart, do, lock, wipe, assign, unassign), filterable by object or verb                                    |\n| `axl_sql_query`              | Execute a conservatively screened SQL SELECT; requires a mutation grant because CUCM SQL side effects cannot be proven absent                                          |\n| `axl_sql_update`             | Execute a SQL INSERT, UPDATE, or DELETE against the CUCM Informix database                                                                                             |\n\n**Built-in resilience:**\n\n- **Retry with exponential backoff** — automatically retries on 429, 503, connection errors, and AXL memory allocation errors\n- **Adaptive rate limiting** — learns from recent throttle events and proactively delays requests to avoid overloading CUCM\n- **JSONL audit trail** — every AXL call is logged per-host to `~/.cisco-axl-mcp/audit/` with timestamps, durations, and status\n\nSupports CUCM versions **11.0, 11.5, 12.0, 12.5, 14.0, and 15.0**.\n\n## Installation\n\nNo install required — npx downloads and runs automatically:\n\n```bash\nnpx @calltelemetry/cisco-axl-mcp\n```\n\nThe package publishes two executables:\n\n| Command             | Purpose                                                       |\n| ------------------- | ------------------------------------------------------------- |\n| `cisco-axl-mcp`     | MCP stdio server for MCP-compatible clients                   |\n| `cisco-axl-mcp-cli` | Schema-driven JSON CLI for discovery and direct AXL execution |\n\n`cisco-axl` was an ambiguous legacy alias and is no longer published. This is a breaking command\nrename; use `cisco-axl-mcp-cli` in scripts and automations. The package is executable-only: it\ndoes not expose a supported JavaScript import API.\n\nFor a global installation:\n\n```bash\nnpm install --global @calltelemetry/cisco-axl-mcp\ncisco-axl-mcp\ncisco-axl-mcp-cli versions\n```\n\nTo run the secondary CLI without installing it globally, select its package binary explicitly:\n\n```bash\nnpx --package @calltelemetry/cisco-axl-mcp cisco-axl-mcp-cli versions\n```\n\n## Command-line AXL client\n\n`cisco-axl-mcp-cli` writes one `cisco-axl.cli.v1` JSON envelope to stdout. Human-readable\ndiagnostics and TLS warnings go to stderr, which keeps stdout safe for pipes and automation.\nBoth executables handle `--help` and `--version` locally, before loading dotenv, credentials,\nnetwork clients, or an MCP transport.\nFor normal direct execution, both then load `.env` through dotenv before resolving their runtime\nconfiguration; process environment values retain their usual precedence over `.env` values.\n\nDiscovery commands do not require CUCM credentials:\n\n```bash\ncisco-axl-mcp-cli versions\ncisco-axl-mcp-cli objects --version 15.0\ncisco-axl-mcp-cli operations --version 15.0 --object Phone\ncisco-axl-mcp-cli describe getPhone --version 15.0\n```\n\nExecution credentials come from `CUCM_HOST`, `CUCM_USERNAME`, `CUCM_PASSWORD`, and\n`CUCM_VERSION`. `--host` and `--version` can override the target for one call. JSON request\ndata can come from `--data`, `--data @file.json`, or stdin; combining an explicit source with\nnon-empty stdin is rejected.\n\n```bash\nexport CUCM_HOST=cucm.example.com\nexport CUCM_USERNAME=axl_user\nexport CUCM_PASSWORD=axl_password\nexport CUCM_VERSION=15.0\n\ncisco-axl-mcp-cli execute getPhone --data '{\"name\":\"SEP001122334455\"}'\ncisco-axl-mcp-cli execute getPhone --data @get-phone.json\nprintf '%s\\n' '{\"searchCriteria\":{\"name\":\"SEP%\"},\"returnedTags\":{\"name\":\"\"}}' \\\n  | cisco-axl-mcp-cli execute listPhone --auto-page\n\ncisco-axl-mcp-cli sql query --file inventory.sql --write --confirm sql-query\nprintf '%s\\n' 'select name from device' | cisco-axl-mcp-cli sql query --write --confirm sql-query\n```\n\nMutations require both an explicit write flag and an exact confirmation token. For an AXL\noperation, the token is the operation name; SQL queries use `sql-query`; SQL updates use `sql-update`:\n\n```bash\ncisco-axl-mcp-cli execute updatePhone \\\n  --data @update-phone.json \\\n  --write \\\n  --confirm updatePhone\n\ncisco-axl-mcp-cli sql update \\\n  --file update-device.sql \\\n  --write \\\n  --confirm sql-update\n```\n\n### TLS behavior\n\nThe direct `cisco-axl-mcp-cli` CLI verifies CUCM TLS certificates by default. Use `--insecure` only for\na specific call to a cluster whose certificate cannot be verified; the CLI emits a warning on\nstderr.\n\nThe MCP executable also verifies CUCM TLS certificates by default. Its TLS configuration precedence is\n`CUCM_AXL_TLS_MODE` → `MCP_TLS_MODE` → `AXL_MCP_CONFIG` `tls_mode`/`tlsMode` → secure default.\n`CUCM_AXL_TLS_MODE` is the preferred dedicated environment variable; `MCP_TLS_MODE` is a legacy\nenvironment name retained only for compatibility. A supplied higher-precedence environment value wins,\nbut malformed JSON configuration still fails startup rather than being ignored.\n\nThe exact accepted values are case-insensitive after trimming whitespace:\n\n- `secure`, `strict`, and `verify` enable certificate verification.\n- `insecure` disables certificate verification. Use it only for a deliberately approved self-signed cluster.\n- `default` is a legacy compatibility alias for `insecure` and is deprecated. Do not use it for new deployments.\n\nFor JSON configuration, use exactly one of `tls_mode` or `tlsMode`, for example\n`AXL_MCP_CONFIG='{\"tls_mode\":\"insecure\"}'`. Supplying both aliases, an unknown value, or an empty value\nfails startup instead of silently changing TLS policy.\n\n## Quick Start\n\n### Claude Code (one-liner)\n\n```bash\nclaude mcp add cucm_axl \\\n  -e CUCM_HOST=cucm.example.com \\\n  -e CUCM_USERNAME=axl_user \\\n  -e CUCM_PASSWORD=axl_password \\\n  -e CUCM_VERSION=14.0 \\\n  -- npx @calltelemetry/cisco-axl-mcp\n```\n\nOr add to `~/.claude.json` manually:\n\n```json\n{\n  \"mcpServers\": {\n    \"cucm_axl\": {\n      \"command\": \"npx\",\n      \"args\": [\"@calltelemetry/cisco-axl-mcp\"],\n      \"env\": {\n        \"CUCM_HOST\": \"cucm.example.com\",\n        \"CUCM_USERNAME\": \"axl_user\",\n        \"CUCM_PASSWORD\": \"axl_password\",\n        \"CUCM_VERSION\": \"14.0\"\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\nCUCM_HOST=cucm.example.com \\\nCUCM_USERNAME=axl_user \\\nCUCM_PASSWORD=axl_password \\\nCUCM_VERSION=14.0 \\\nnpx @calltelemetry/cisco-axl-mcp\n```\n\n## Configuration\n\n### Credentials\n\n| Environment Variable | Description                                                   |\n| -------------------- | ------------------------------------------------------------- |\n| `CUCM_HOST`          | CUCM server hostname or IP                                    |\n| `CUCM_USERNAME`      | AXL API username                                              |\n| `CUCM_PASSWORD`      | AXL API password                                              |\n| `CUCM_VERSION`       | CUCM version (`11.0`, `11.5`, `12.0`, `12.5`, `14.0`, `15.0`) |\n\nMCP tools use these process credentials by default. They are injected by the MCP host configuration and are not exposed in normal tool schemas or model transcripts. `cucm_version` remains an optional non-secret target-version selector.\n\n### Credential provider mode\n\nFor long-running MCP processes, provider mode can refresh only the username and password while\nkeeping one process bound to one fixed target. Set `CUCM_HOST` and `CUCM_VERSION` at startup; the\ntarget host, schema version, TLS mode, allowlists, retry policy, and other service policy are\nimmutable for the life of the process. Provider mode is therefore single-target, not a\nmulti-cluster credential router. It rejects `CUCM_USERNAME` and `CUCM_PASSWORD` as well as inline\ncredential compatibility mode; choose static credentials or a provider, never both.\n\nThe provider setting is a JSON argv array. Its first element must be an absolute executable path;\nremaining elements are passed as separate arguments with shell execution disabled. Do not put\nsecrets in the array or in process arguments. This vendor-neutral example uses only a non-secret\nasset label:\n\n```bash\nCUCM_HOST=cucm.example.test\nCUCM_VERSION=11.5\nAXL_MCP_CREDENTIAL_PROVIDER='[\"/absolute/path/to/provider\",\"--asset-id\",\"lab-cucm\"]'\nAXL_MCP_CREDENTIAL_TTL_S=300\nAXL_MCP_CREDENTIAL_MAX_STALE_S=0\nAXL_MCP_CREDENTIAL_PROVIDER_TIMEOUT_MS=10000\nAXL_MCP_CREDENTIAL_REFRESH_ON_SIGHUP=false\n```\n\nEach provider invocation must write exactly one JSON object to stdout with exactly these two keys\nand no others: `{\"username\":\"<username>\",\"password\":\"<password>\"}`. Credential values are\nconsumed in memory and are never emitted in MCP responses, diagnostics, audit records, or failure\nmessages. Provider stderr is not part of the credential protocol.\n\n| Environment Variable | Default | Contract |\n| -------------------- | ------- | -------- |\n| `AXL_MCP_CREDENTIAL_PROVIDER` | unset | JSON argv array with an absolute executable path; enables provider mode. |\n| `AXL_MCP_CREDENTIAL_TTL_S` | `300` | Primary refresh interval in seconds (`30`–`86400`). |\n| `AXL_MCP_CREDENTIAL_MAX_STALE_S` | `0` | Maximum bounded stale window after TTL (`0`–`259200`). Outside it, admission fails closed. |\n| `AXL_MCP_CREDENTIAL_PROVIDER_TIMEOUT_MS` | `10000` | Provider process timeout in milliseconds (`100`–`60000`). |\n| `AXL_MCP_CREDENTIAL_REFRESH_ON_SIGHUP` | platform default | Optional early refresh on `SIGHUP`; TTL remains the primary refresh mechanism. |\n\nWhen a TTL refresh succeeds with a changed password, new requests use the new credential\ngeneration while already-admitted work keeps its old lease until it drains. A provider timeout,\nnon-zero exit, malformed output, or expired stale window never falls back to an unbounded or\npartially parsed credential. A failed refresh may use the previous snapshot only inside the\nconfigured bounded stale window; after that, requests fail closed with the value-free\n`AXL_CREDENTIALS_UNAVAILABLE` error. Provider setup/output failures use the value-free\n`AXL_CREDENTIAL_PROVIDER_INVALID` error.\n\nThis release does not infer authentication failures from arbitrary AXL response text and does not\nretry authentication by rotating credentials. When transport evidence is insufficient to prove a\nstable numeric authentication-status shape, credential refresh is available only through the TTL\nand optional `SIGHUP` controls above. There is no credential-management MCP tool; the existing\neight-tool surface is unchanged.\n\n#### Deprecated inline credential compatibility\n\nPer-request `cucm_host`, `cucm_username`, and `cucm_password` fields are disabled by default. Supplying any of them returns `AXL_INLINE_CREDENTIALS_DISABLED` before an AXL transport is created. This keeps credentials out of model-visible tool schemas, responses, errors, retry diagnostics, and audit records.\n\nFor a temporary migration only, set `AXL_MCP_ALLOW_INLINE_CREDENTIALS=true` (or `allow_inline_credentials: true` in `AXL_MCP_CONFIG`). The server writes a startup warning and deliberately adds only the exact `cucm_host`, `cucm_username`, and `cucm_password` fields back to the execution and SQL tool schemas; aliases remain rejected. Treat this mode as deprecated: use a separate MCP host/process with its own `CUCM_*` environment for each CUCM cluster instead.\n\n### Object Allowlisting (Optional)\n\nRestrict which object types the server can operate on:\n\n```bash\n# Environment variable\nAXL_MCP_ENABLED_OBJECTS=Phone,User,LineGroup\n\n# CLI argument\nnpx @calltelemetry/cisco-axl-mcp --enabled-objects Phone,User,LineGroup\n\n# JSON config\nAXL_MCP_CONFIG='{\"enabled_objects\": [\"Phone\", \"User\", \"LineGroup\"]}'\n```\n\nWhen set, only the specified object types and their CRUD + action operations are available. Global\nactions require a separate explicit opt-in. Omit the list to expose no object operations; use `*` or\n`all` to opt into every supported object type.\n\n### Resilience & Audit\n\n| Environment Variable          | Default    | Description                                                                |\n| ----------------------------- | ---------- | -------------------------------------------------------------------------- |\n| `AXL_MCP_MAX_RETRIES`         | `3`        | Max retry attempts on transient failures                                   |\n| `AXL_MCP_RETRY_BASE_DELAY_MS` | `1000`     | Initial backoff delay in milliseconds                                      |\n| `AXL_MCP_ENABLE_SQL`          | `false`    | Enable SQL tools (`true` to enable)                                        |\n| `AXL_MCP_MAX_AUTOPAGINATE`    | `10000`    | Max rows returned by `autoPage`                                            |\n| `AXL_MCP_AUDIT_LOG`           | `metadata` | Audit log detail level (see below); unknown values fail closed to metadata |\n| `AXL_MCP_AUDIT_MAX_SIZE_MB`   | `10`       | Audit log rotation threshold per host                                      |\n\n### Audit Log\n\nEvery AXL call is logged per cluster to an opaque stable filename under `~/.cisco-axl-mcp/audit/`; the CUCM host is not included in the path. The `AXL_MCP_AUDIT_LOG` variable controls what gets logged:\n\n| Level                | Request Payload | Response Payload | Description                                                                   |\n| -------------------- | :-------------: | :--------------: | ----------------------------------------------------------------------------- |\n| `off`                |                 |                  | No audit logging                                                              |\n| `metadata` (default) |                 |                  | Operation, status, duration, rows only; also used for unknown or empty values |\n| `request`            |     **yes**     |                  | Metadata + request payload with credentials redacted                          |\n| `full`               |     **yes**     |     **yes**      | Metadata + request + full response payload                                    |\n\nCredentials (`cucm_password`, `cucm_username`, `cucm_host`, `password`, `username`, `host`) are automatically redacted from request payloads at all log levels.\n\n```jsonl\n{\"ts\":\"2026-03-14T15:30:00.000Z\",\"operation\":\"listPhone\",\"durationMs\":342,\"status\":\"ok\",\"rows\":50,\"request\":{\"searchCriteria\":{\"name\":\"SEP%\"}}}\n{\"ts\":\"2026-03-14T15:30:01.000Z\",\"operation\":\"executeSQLQuery\",\"durationMs\":1200,\"status\":\"throttled\",\"error\":\"Maximum AXL Memory Allocation Consumed\",\"request\":{\"sql\":\"SELECT name FROM device\"}}\n```\n\nWhen recent throttle events are detected, the server automatically adds a proactive delay before subsequent requests to avoid overloading CUCM.\n\n### MCP cancellation and mutation outcomes\n\nThe MCP server propagates the SDK request cancellation signal through queueing,\nretry/backoff, the AXL service, and the SOAP transport. A cancellation before\ndispatch is recorded as `AXL_REQUEST_CANCELLED` and queued work never reaches\nCUCM. Do not interpret cancellation after a mutation has been dispatched as\nproof that CUCM did not apply it: the server records and returns\n`AXL_MUTATION_OUTCOME_UNKNOWN` with the audit `errorCode`/`category` set to the\nsame value. Some MCP clients suppress a response once they cancel a request;\nthat does not change the server-side outcome. Reconcile with a fresh safe\nreadback and the audit/status path before attempting another mutation.\n\n## Tools\n\n### `axl_execute`\n\nExecute any AXL operation by name.\n\n**Parameters:**\n\n| Parameter      | Required | Description                                                                                                                       |\n| -------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------- |\n| `operation`    | Yes      | AXL operation name (e.g. `addPhone`, `getUser`, `listLineGroup`)                                                                  |\n| `data`         | Yes      | AXL request payload — the JSON body sent as the SOAP request                                                                      |\n| `returnedTags` | No       | List of field names to return. Supports dot notation for nested fields, e.g. `[\"name\", \"model\", \"lines.line.dirn.pattern\"]`       |\n| `opts`         | No       | Options: `{ clean, removeAttributes, dataContainerIdentifierTails }`                                                              |\n| `autoPage`     | No       | When `true`, automatically paginates list operations and returns all results (max 10,000 rows). Only valid for `list*` operations |\n| `cucm_version` | No       | Override default version                                                                                                          |\n\n`cucm_host`, `cucm_username`, and `cucm_password` appear only when the deprecated `AXL_MCP_ALLOW_INLINE_CREDENTIALS=true` compatibility setting is enabled.\n\nMutations require a `mutationGrant` returned by `axl_preview_mutation`. The\nclient must first show the exact preview to a human and obtain explicit approval,\nthen submit that unchanged grant with `axl_execute`. A preview does not contact\nCUCM and does not verify a human identity; client-side approval records are the\noperator's responsibility. Grants are short-lived, single-use, process-local,\nand bind an opaque authority-keyed endpoint and exact transport-principal/profile\ndigest (not the host, username, or password). Password rotation for the same\nprincipal is allowed; hostname, username (including case or whitespace), version,\nschema, package, operation, and payload drift are rejected before dispatch.\n\n### `axl_preview_mutation`\n\nValidate and normalize one enabled AXL mutation without performing transport,\nthen return the exact single-use `mutationGrant` for an approved execution.\nIt is advertised only when configuration permits at least one mutation. Reads,\ndisabled objects, denied global actions, disabled SQL, invalid version/schema,\nand unapproved inline credential aliases are rejected before a grant is minted.\n\n**Parameters:** the same `operation`, `data`, `returnedTags`, `opts`,\n`autoPage`, and optional `cucm_version` fields as `axl_execute`, excluding\n`mutationGrant`.\n\n### `axl_describe_operation`\n\nReturns the input schema for an AXL operation — required fields, types, enums, defaults, and nested structure. Use this to build correct payloads for `axl_execute` without guessing.\n\n**Parameters:**\n\n| Parameter       | Required | Description                                                 |\n| --------------- | -------- | ----------------------------------------------------------- |\n| `operationName` | Yes      | AXL operation name (e.g. `addPhone`, `getUser`, `listLine`) |\n\n**Returns:** `{ wsdlVersion, operationName, verb, object, fields }` where each field includes:\n\n| Property   | Description                                                    |\n| ---------- | -------------------------------------------------------------- |\n| `type`     | `\"string\"`, `\"boolean\"`, `\"integer\"`, `\"object\"`, or `\"array\"` |\n| `required` | `true` when the field is mandatory (omitted when optional)     |\n| `default`  | Default value from the XSD, if any                             |\n| `enum`     | Inline enum values for small enums (≤ 30 values)               |\n| `enumType` | Reference to a large enum type (look up via `AXL_ENUMS`)       |\n| `typeName` | XSD type name for complex types                                |\n| `fields`   | Nested child fields (depth-limited to 3 levels)                |\n\n### `axl_list_objects`\n\nReturns all top-level CUCM object types available in the loaded WSDL version.\n\n**Parameters:** None\n\n**Returns:** `{ wsdlVersion, objectCount, objects[] }`\n\n### `axl_list_operations`\n\nReturns the CRUD operations available for a specific object type.\n\n**Parameters:**\n\n| Parameter    | Required | Description                                          |\n| ------------ | -------- | ---------------------------------------------------- |\n| `objectName` | Yes      | Object type name (e.g. `Phone`, `User`, `LineGroup`) |\n\n**Returns:** `{ wsdlVersion, objectName, operations: { add, get, list, update, remove, apply?, reset?, restart?, lock?, wipe?, ... } }`\n\nAction verbs (apply, reset, restart, lock, wipe, etc.) are included when the object supports them. For example, Phone returns `apply`, `reset`, `restart`, `lock`, `wipe` alongside the standard CRUD verbs.\n\n### `axl_list_action_operations`\n\nDiscover all 123 non-CRUD action operations across the AXL schema — apply, reset, restart, do, lock, wipe, assign, unassign.\n\n**Parameters:**\n\n| Parameter    | Required | Description                                                           |\n| ------------ | -------- | --------------------------------------------------------------------- |\n| `objectName` | No       | Filter by object type (e.g. `Phone` shows only phone-related actions) |\n| `verb`       | No       | Filter by verb prefix (e.g. `reset` shows all reset operations)       |\n\n**Returns:** `{ wsdlVersion, totalCount, operations[] }` where each operation includes the verb, object (if mapped), and full operation name.\n\n**Examples:**\n\n```json\n// All action ops for Phone\n{ \"objectName\": \"Phone\" }\n// → applyPhone, resetPhone, restartPhone, lockPhone, wipePhone\n\n// All \"do\" operations (global actions)\n{ \"verb\": \"do\" }\n// → doDeviceReset, doLdapSync, doChangeDNDStatus, ...\n```\n\n### `axl_sql_query`\n\nExecute a conservatively screened SQL SELECT against CUCM Informix via AXL's\n`executeSQLQuery`. CUCM views, virtual tables, sequences, and routines cannot\nbe proven side-effect-free without an immutable catalog, so every SQL query\nrequires a single-use, request-bound mutation grant and is dispatched at most\nonce. The lexical screen rejects comments, multiple statements, sequences,\ncalls, subqueries, and other ambiguous forms; it intentionally accepts only a\nsmall simple-SELECT subset. Obtain its grant with `axl_preview_mutation` after\nexplicit human approval, then submit that unchanged grant with the SQL request.\n\n**Parameters:**\n\n| Parameter       | Required | Description                                      |\n| --------------- | -------- | ------------------------------------------------ |\n| `sql`           | Yes      | Conservatively screened SQL SELECT               |\n| `mutationGrant` | Yes      | Single-use grant returned by an approved preview |\n| `cucm_version`  | No       | Override default version                         |\n\n**Example:**\n\n```json\n{\n  \"sql\": \"SELECT name, description FROM device WHERE name = 'SEP001122334455' ORDER BY name LIMIT 1\"\n}\n```\n\n### `axl_sql_update`\n\nExecute a SQL INSERT, UPDATE, or DELETE against the CUCM Informix database via AXL's `executeSQLUpdate`.\n\n**Parameters:**\n\n| Parameter       | Required | Description                                      |\n| --------------- | -------- | ------------------------------------------------ |\n| `sql`           | Yes      | SQL INSERT, UPDATE, or DELETE statement          |\n| `mutationGrant` | Yes      | Single-use grant returned by an approved preview |\n| `cucm_version`  | No       | Override default version                         |\n\n> **Note:** SQL tools can be disabled by setting `AXL_MCP_ENABLE_SQL=false`.\n\n## How `returnedTags` Works\n\nAXL uses `returnedTags` to select which fields come back in a response — like a SELECT clause in SQL. Without it, AXL returns every field on the object.\n\nThe `returnedTags` parameter accepts a **list of field names**. Flat fields are straightforward:\n\n```json\n{\n  \"operation\": \"getPhone\",\n  \"data\": { \"name\": \"SEP001122334455\" },\n  \"returnedTags\": [\"name\", \"model\", \"callingSearchSpaceName\"]\n}\n```\n\nFor **nested fields** (like line details on a phone), use dot notation:\n\n```json\n{\n  \"returnedTags\": [\n    \"name\",\n    \"lines.line.index\",\n    \"lines.line.dirn.pattern\",\n    \"lines.line.dirn.routePartitionName\"\n  ]\n}\n```\n\nThe MCP server automatically expands dot notation into the nested object structure that AXL expects. The example above becomes:\n\n```json\n{\n  \"name\": \"SEP001122334455\",\n  \"returnedTags\": {\n    \"name\": true,\n    \"lines\": {\n      \"line\": {\n        \"index\": true,\n        \"dirn\": {\n          \"pattern\": true,\n          \"routePartitionName\": true\n        }\n      }\n    }\n  }\n}\n```\n\nYou can also pass the nested object form directly in `data.returnedTags` if you prefer — the array form is just a convenience.\n\n## Discovery Flow\n\nAn LLM discovers how to use AXL operations in three steps:\n\n```\naxl_list_objects              → what object types exist? (Phone, User, LineGroup, ...)\naxl_list_operations           → what ops exist for Phone? (add, get, list, update, remove, apply, reset, restart, lock, wipe)\naxl_list_action_operations    → what action ops exist? (123 non-CRUD ops: apply, reset, do, lock, wipe, ...)\naxl_describe_operation        → what fields does addPhone require?\naxl_execute                   → call addPhone with the correct payload\naxl_sql_query                 → run SQL directly against the CUCM Informix database\n```\n\nFields marked `required: true` must be included. Fields with `enum` or `enumType` constrain valid values. For complex queries that don't map well to AXL CRUD operations, use `axl_sql_query` to query the database directly. See the [Examples](#examples--llm-conversations-real-cucm-15-output) section below for full interactive walkthroughs.\n\n## Examples — LLM Conversations (Real CUCM 15 Output)\n\nAll examples below are real interactions with a live CUCM 15.0.1 cluster, showing how an LLM uses the tools conversationally.\n\n---\n\n### \"What can I manage through AXL?\"\n\n> **User:** What object types are available in AXL?\n\n<details><summary>Tool call: <code>axl_list_objects</code></summary>\n\n```json\n{}\n```\n\n```json\n{\n  \"wsdlVersion\": \"15.0\",\n  \"objectCount\": 232,\n  \"objects\": [\n    \"AarGroup\",\n    \"Announcement\",\n    \"AppUser\",\n    \"CallManager\",\n    \"CallManagerGroup\",\n    \"CallPark\",\n    \"CallPickupGroup\",\n    \"CommonDeviceConfig\",\n    \"Css\",\n    \"CtiRoutePoint\",\n    \"DevicePool\",\n    \"DeviceProfile\",\n    \"H323Gateway\",\n    \"H323Trunk\",\n    \"HuntList\",\n    \"HuntPilot\",\n    \"Line\",\n    \"LineGroup\",\n    \"Location\",\n    \"MediaResourceGroup\",\n    \"MediaResourceList\",\n    \"Phone\",\n    \"RecordingProfile\",\n    \"Region\",\n    \"RouteGroup\",\n    \"RouteList\",\n    \"RoutePartition\",\n    \"RoutePattern\",\n    \"SipProfile\",\n    \"SipTrunk\",\n    \"TransPattern\",\n    \"User\",\n    \"VoiceMailProfile\",\n    \"... 199 more objects\"\n  ]\n}\n```\n\n</details>\n\n> **Assistant:** AXL exposes **232 object types** on your CUCM 15.0 cluster. The most commonly used ones:\n>\n> - **Devices:** Phone, DeviceProfile, H323Gateway, SipTrunk, CtiRoutePoint\n> - **Dial plan:** Line, RoutePartition, Css, RoutePattern, TransPattern, HuntList, HuntPilot, LineGroup\n> - **Users:** User, AppUser\n> - **Infrastructure:** DevicePool, CallManagerGroup, Region, Location, MediaResourceList\n>\n> Want me to check what operations are available for a specific object?\n\n---\n\n### \"What operations can I do with phones?\"\n\n> **User:** What CRUD operations exist for Phone?\n\n<details><summary>Tool call: <code>axl_list_operations</code></summary>\n\n```json\n{ \"objectName\": \"Phone\" }\n```\n\n```json\n{\n  \"wsdlVersion\": \"15.0\",\n  \"objectName\": \"Phone\",\n  \"operations\": {\n    \"add\": \"addPhone\",\n    \"get\": \"getPhone\",\n    \"list\": \"listPhone\",\n    \"remove\": \"removePhone\",\n    \"update\": \"updatePhone\",\n    \"apply\": \"applyPhone\",\n    \"reset\": \"resetPhone\",\n    \"restart\": \"restartPhone\",\n    \"lock\": \"lockPhone\",\n    \"wipe\": \"wipePhone\"\n  }\n}\n```\n\n</details>\n\n> **Assistant:** Phone supports 5 CRUD operations plus 5 action operations:\n>\n> | Operation   | Name           | Use case                                                                                   |\n> | ----------- | -------------- | ------------------------------------------------------------------------------------------ |\n> | **add**     | `addPhone`     | Provision a new device                                                                     |\n> | **get**     | `getPhone`     | Retrieve full config by name or UUID                                                       |\n> | **list**    | `listPhone`    | Search/filter phones with wildcards                                                        |\n> | **update**  | `updatePhone`  | Modify settings on an existing phone                                                       |\n> | **remove**  | `removePhone`  | Delete a device                                                                            |\n> | **apply**   | `applyPhone`   | Push pending config changes to the phone                                                   |\n> | **reset**   | `resetPhone`   | Full reset — unregisters, reloads config, re-registers                                     |\n> | **restart** | `restartPhone` | Restart the phone process without full re-registration                                     |\n> | **lock**    | `lockPhone`    | Lock the device PIN (Cisco Jabber/Webex mobile clients)                                    |\n> | **wipe**    | `wipePhone`    | Factory-reset a mobile client, erasing all local data and credentials (Cisco Jabber/Webex) |\n>\n> Want me to describe the required fields for any of these?\n\n---\n\n### \"What fields does addPhone need?\"\n\n> **User:** What are the required fields for adding a phone?\n\n<details><summary>Tool call: <code>axl_describe_operation</code> — schema discovery</summary>\n\n```json\n{ \"operationName\": \"addPhone\" }\n```\n\n```json\n{\n  \"wsdlVersion\": \"15.0\",\n  \"operationName\": \"addPhone\",\n  \"verb\": \"add\",\n  \"object\": \"Phone\",\n  \"fields\": {\n    \"phone\": {\n      \"type\": \"object\",\n      \"required\": true,\n      \"fields\": {\n        \"name\":            { \"type\": \"string\",  \"required\": true },\n        \"product\":         { \"type\": \"string\",  \"required\": true, \"enumType\": \"XProduct\" },\n        \"class\":           { \"type\": \"string\",  \"required\": true, \"enum\": [\"Phone\", \"Gateway\", \"...\"] },\n        \"protocol\":        { \"type\": \"string\",  \"required\": true, \"enum\": [\"SCCP\", \"SIP\", \"...\"] },\n        \"protocolSide\":    { \"type\": \"string\",  \"required\": true, \"default\": \"User\" },\n        \"devicePoolName\":  { \"type\": \"string\",  \"required\": true },\n        \"commonPhoneConfigName\": { \"type\": \"string\", \"required\": true },\n        \"locationName\":    { \"type\": \"string\",  \"required\": true },\n        \"phoneTemplateName\": { \"type\": \"string\", \"required\": true },\n        \"builtInBridgeStatus\": { \"type\": \"string\", \"required\": true, \"default\": \"Default\" },\n        \"packetCaptureMode\": { \"type\": \"string\", \"required\": true, \"default\": \"None\" },\n        \"certificateOperation\": { \"type\": \"string\", \"required\": true, \"default\": \"No Pending Operation\" },\n        \"deviceMobilityMode\": { \"type\": \"string\", \"required\": true, \"default\": \"Default\" },\n        \"description\":     { \"type\": \"string\" },\n        \"callingSearchSpaceName\": { \"type\": \"string\" },\n        \"lines\":           { \"type\": \"object\", \"fields\": { \"line\": [\"index\", \"dirn\", \"...\"] } },\n        \"...70+ optional fields\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n> **Assistant:** `addPhone` requires a `phone` object with these mandatory fields:\n>\n> | Field                   | Type   | Notes                                             |\n> | ----------------------- | ------ | ------------------------------------------------- |\n> | `name`                  | string | Device name (e.g. `SEPAABBCCDDEEFF`)              |\n> | `product`               | enum   | Product model (uses `XProduct` enum — large list) |\n> | `class`                 | enum   | `Phone`, `Gateway`, etc.                          |\n> | `protocol`              | enum   | `SIP` or `SCCP` (most common)                     |\n> | `devicePoolName`        | string | FK to a Device Pool                               |\n> | `commonPhoneConfigName` | string | FK to Common Phone Config                         |\n> | `locationName`          | string | FK to a Location                                  |\n> | `phoneTemplateName`     | string | FK to a Phone Button Template                     |\n>\n> Several required fields have defaults (`protocolSide: \"User\"`, `builtInBridgeStatus: \"Default\"`, etc.) so you can omit them unless you need non-default values. There are 70+ optional fields for lines, speed dials, BLF, services, security, and more.\n\n---\n\n### \"Show me all phones on the cluster\"\n\n> **User:** List all the phones configured on CUCM.\n\n<details><summary>Tool call: <code>axl_execute</code> — listPhone</summary>\n\n```json\n{\n  \"operation\": \"listPhone\",\n  \"data\": {\n    \"searchCriteria\": { \"name\": \"SEP%\" },\n    \"returnedTags\": { \"name\": \"\", \"model\": \"\", \"description\": \"\" }\n  }\n}\n```\n\n```json\n{\n  \"phone\": [\n    { \"name\": \"SEP000832C78E0F\", \"model\": \"Cisco 7821\", \"description\": \"Auto 1001\" },\n    { \"name\": \"SEP000C291130BA\", \"model\": \"Cisco IP Communicator\", \"description\": \"Auto 1002\" },\n    { \"name\": \"SEP0022905C7710\", \"model\": \"Cisco 7975\", \"description\": \"Auto 1000 7975 Phone3\" },\n    { \"name\": \"SEP010CE46F48A2\", \"model\": \"Cisco 7965\", \"description\": \"Lexie Towne - Ardith\" },\n    { \"name\": \"SEP505C885DF37F\", \"model\": \"Cisco 9841\", \"description\": \"Auto 1003 9841\" },\n    \"... 118 phones total\"\n  ]\n}\n```\n\n</details>\n\n> **Assistant:** Found **123 phones** configured in AXL. Here's a summary by model:\n>\n> | Model                 | Count | Examples                                            |\n> | --------------------- | ----- | --------------------------------------------------- |\n> | Cisco 7965            | ~60   | Provisioned users (Lexie Towne, Gabe Gottlieb, ...) |\n> | Cisco 7945            | ~55   | Provisioned users                                   |\n> | Cisco 7821            | 1     | SEP000832C78E0F — Auto 1001                         |\n> | Cisco 7975            | 1     | SEP0022905C7710 — Auto 1000                         |\n> | Cisco 9841            | 1     | SEP505C885DF37F — Auto 1003                         |\n> | Cisco IP Communicator | 1     | SEP000C291130BA — Auto 1002                         |\n>\n> The bulk of the inventory appears to be synthetic test data (7945/7965 models). The 3 \"Auto\" phones are the real lab devices.\n\n---\n\n### \"Get the full config for a specific phone\"\n\n> **User:** Show me the config for the 7821 phone, including its line details.\n\n<details><summary>Tool call: <code>axl_execute</code> — getPhone with nested returnedTags</summary>\n\n```json\n{\n  \"operation\": \"getPhone\",\n  \"data\": { \"name\": \"SEP000832C78E0F\" },\n  \"returnedTags\": [\n    \"name\",\n    \"model\",\n    \"description\",\n    \"devicePoolName\",\n    \"callingSearchSpaceName\",\n    \"lines.line.index\",\n    \"lines.line.dirn.pattern\",\n    \"lines.line.dirn.routePartitionName\"\n  ]\n}\n```\n\n```json\n{\n  \"phone\": {\n    \"name\": \"SEP000832C78E0F\",\n    \"description\": \"Auto 1001\",\n    \"model\": \"Cisco 7821\",\n    \"callingSearchSpaceName\": \"CT-Internal-CSS\",\n    \"devicePoolName\": \"Default\",\n    \"lines\": {\n      \"line\": [\n        {\n          \"index\": \"1\",\n          \"dirn\": {\n            \"pattern\": \"1001\",\n            \"routePartitionName\": \"CT-Internal\"\n          }\n        }\n      ]\n    }\n  }\n}\n```\n\n</details>\n\n> **Assistant:** Here's the 7821 config:\n>\n> - **Device:** SEP000832C78E0F (Cisco 7821)\n> - **Description:** Auto 1001\n> - **Device Pool:** Default\n> - **Calling Search Space:** CT-Internal-CSS\n> - **Line 1:** DN `1001` in partition `CT-Internal`\n>\n> The `returnedTags` dot notation (`lines.line.dirn.pattern`) automatically expands into the nested AXL structure — you don't need to build the XML nesting manually.\n\n---\n\n### \"What operations exist for LineGroup?\"\n\n> **User:** I need to set up hunt groups. What can I do with LineGroup?\n\n<details><summary>Tool call: <code>axl_list_operations</code></summary>\n\n```json\n{ \"objectName\": \"LineGroup\" }\n```\n\n```json\n{\n  \"wsdlVersion\": \"15.0\",\n  \"objectName\": \"LineGroup\",\n  \"operations\": {\n    \"add\": \"addLineGroup\",\n    \"get\": \"getLineGroup\",\n    \"list\": \"listLineGroup\",\n    \"remove\": \"removeLineGroup\",\n    \"update\": \"updateLineGroup\"\n  }\n}\n```\n\n</details>\n\n> **Assistant:** LineGroup supports full CRUD. For a hunt group setup, the typical workflow is:\n>\n> 1. **`addLineGroup`** — Create a line group with member DNs and a distribution algorithm (Top Down, Circular, etc.)\n> 2. **`addHuntList`** — Create a hunt list referencing one or more line groups\n> 3. **`addHuntPilot`** — Create the pilot number users dial to reach the hunt group\n>\n> Want me to describe the required fields for `addLineGroup` so we can build the payload?\n\n---\n\n### \"Enable Built-in Bridge on a phone\"\n\n> **User:** Turn on BIB for the 7821.\n\n<details><summary>Tool calls: preview, explicit approval, then <code>axl_execute</code> — updatePhone</summary>\n\n```json\n{\n  \"operation\": \"updatePhone\",\n  \"data\": {\n    \"name\": \"SEP000832C78E0F\",\n    \"builtInBridgeStatus\": \"On\"\n  }\n}\n```\n\nAfter the client displays this preview and records explicit human approval, it\nsubmits the exact returned grant:\n\n```json\n{\n  \"operation\": \"updatePhone\",\n  \"data\": {\n    \"name\": \"SEP000832C78E0F\",\n    \"builtInBridgeStatus\": \"On\"\n  },\n  \"mutationGrant\": \"<the exact object returned by axl_preview_mutation>\"\n}\n```\n\n```json\n{ \"return\": \"{7C6B3FC2-C043-480F-811D-641BA7E47909}\" }\n```\n\n</details>\n\n> **Assistant:** Done — Built-in Bridge is now **On** for SEP000832C78E0F. The phone will need to reset for the change to take effect. Update operations just take the device name plus the fields to change.\n\n---\n\n### \"Query a different cluster\"\n\n> **User:** Can you check phones on our London cluster too?\n\n> **Assistant:** Configure a separate MCP host process for the London cluster so its credentials stay outside model-visible tool calls:\n\n```json\n{\n  \"command\": \"npx\",\n  \"args\": [\"@calltelemetry/cisco-axl-mcp\"],\n  \"env\": {\n    \"CUCM_HOST\": \"10.1.1.5\",\n    \"CUCM_USERNAME\": \"london_axl\",\n    \"CUCM_PASSWORD\": \"set-by-your-secret-manager\",\n    \"CUCM_VERSION\": \"14.0\"\n  }\n}\n```\n\n> Start that process with credentials injected by your secret manager, then call its ordinary tools without credential arguments. The legacy inline fields can be temporarily re-enabled only with `AXL_MCP_ALLOW_INLINE_CREDENTIALS=true`; do not use that compatibility mode for new integrations.\n\n## CUCM Prerequisites\n\nThe AXL API user needs the **Standard AXL API Access** role in CUCM. To set this up:\n\n1. In CUCM Administration, go to **User Management > Application User** (or End User)\n2. Create or select a user\n3. Add the **Standard AXL API Access** role\n4. Ensure the AXL Web Service is activated in **Cisco Unified Serviceability > Tools > Service Activation**\n\n## Development\n\nRequires **Node.js 22+** and **Yarn 4** (via Corepack).\n\n### Building and Testing\n\n```bash\ngit clone https://github.com/calltelemetry/cisco-axl-mcp.git\ncd cisco-axl-mcp\ncorepack enable           # Activates Yarn 4 via packageManager field\nyarn install\nyarn build                # Uses pre-committed generated types — no WSDL schemas needed\nyarn test                 # Run full test suite\n```\n\nThe generated TypeScript types in `src/types/generated/` and `generated/` are checked into the repo. Contributors can build, test, and modify the MCP server without needing access to any WSDL files.\n\n### Available Scripts\n\n| Command             | Description                                     |\n| ------------------- | ----------------------------------------------- |\n| `yarn build`        | Build with Vite                                 |\n| `yarn test`         | Run all tests (Vitest)                          |\n| `yarn test:mcp`     | Run MCP conformance tests only                  |\n| `yarn typecheck`    | TypeScript type checking                        |\n| `yarn lint`         | ESLint                                          |\n| `yarn lint:fix`     | ESLint with auto-fix                            |\n| `yarn format`       | Prettier format                                 |\n| `yarn format:check` | Prettier check                                  |\n| `yarn validate`     | Typecheck + lint + test (full pre-commit check) |\n\n### Regenerating AXL Types\n\nThis is only needed when adding support for new CUCM versions or new AXL object types. The [`cisco-axl`](https://github.com/sieteunoseis/cisco-axl) library by [Jeremy Worden](https://github.com/sieteunoseis) bundles Cisco AXL WSDL schemas for versions 11.0–15.0 in its npm package. The type generation script reads these directly from `node_modules`:\n\n```bash\nyarn install                # cisco-axl ships WSDLs in node_modules/cisco-axl/schema/\nyarn generate:types         # Parses WSDLs, updates src/types/generated/ and generated/\n```\n\nTo use schemas from a custom location:\n\n```bash\nyarn generate:types --schema-dir /path/to/schema\n```\n\nAfter regeneration, commit the updated generated files.\n\n## Contributing\n\nContributions are welcome! To get started:\n\n1. Fork the repo and create a feature branch\n2. Run `corepack enable && yarn install`\n3. Make your changes\n4. Run `yarn validate` (typecheck + lint + tests must all pass)\n5. Open a pull request against `main`\n\nCI runs automatically on pull requests — typecheck, lint, tests with coverage, and build must all pass before merge. The `main` branch is protected and requires CI to pass.\n\n## npm trusted publishing\n\nReleases are created by Release Please from `main`; the release job then checks out the exact\nrelease tag and publishes with npm OIDC provenance. The workflow uses the GitHub Actions\nenvironment named `npm`, job-level `id-token: write`, and no npm token secret. Its repository\nrelease App requires the `RELEASE_APP_CLIENT_ID` repository variable and the\n`RELEASE_APP_PRIVATE_KEY` secret.\n\nThe trusted-publisher relationship is an external npm setting and must be operator-confirmed as\n`calltelemetry` / `cisco-axl-mcp` / `release.yml` / `npm`. Source changes cannot prove that\nsetting or a registry artifact. Until a protected-branch release is authorized, its exact tag is\npublished, and the package's npm provenance/attestation is inspected, release proof remains\npending. Do not use a manual `npm publish` or token-based fallback.\n\n## Acknowledgments\n\nThis project is made possible by:\n\n- **[cisco-axl](https://github.com/sieteunoseis/cisco-axl)** by [Jeremy Worden](https://github.com/sieteunoseis) — the underlying AXL SOAP client that handles all CUCM communication\n- **[Model Context Protocol SDK](https://github.com/modelcontextprotocol/typescript-sdk)** by Anthropic — the MCP server framework\n- **[strong-soap](https://github.com/loopbackio/strong-soap)** by IBM Corp. & LoopBack contributors — WSDL parsing\n\n## License\n\nMIT — see [LICENSE](LICENSE) for details.\n","readmeFilename":"README.md"}