Reference¶
Last update: October 8, 2026
This page is the comprehensive technical reference for Tolk for Cisco UC β MCP tools, prompts, resources, HTTP endpoints, audit log events, error types, standards compliance, scripts, internal modules and glossary.
MCP Tools Reference¶
All tools use the namespace prefix of their module. RBAC is enforced at the operation level (not per tool): AXL, RIS, SSH, CUPI, phone, RoomOS xAPI, Serviceability and report operations are checked against the client's profile allowlists and rate limits, and a denied operation returns a ProfilePermissionError. Credential-management tools (store/update/delete/list) are available to any authenticated client, since each client manages its own set of Cisco UC credentials. A client's product_scope still governs which product modules (CUCM, IMP, CUC) it can see at all.
CUCM Module¶
| Tool | Description |
|---|---|
cucm_axl_call |
Execute an AXL SOAP operation (get, list, add, update, remove, do, SQL, β¦) |
cucm_check_connectivity |
Check AXL, RIS and SSH connectivity to a CUCM host β returns per-service latency |
cucm_cop_install_list |
List the COP file install jobs of the calling client (to resume one) |
cucm_cop_install_start |
Install COP files one at a time (cluster wide or node by node); cmterm-*: Device Defaults kept or restored |
cucm_cop_install_status |
Follow a COP install job (resumes after SSH loss / restart) β final β /β report per node |
cucm_cop_precheck |
Read-only prechecks: replication, upgrade, disk, version, NTP, DRF, certs, Device Defaults |
cucm_delete_credentials |
Delete CUCM AXL credentials for a host |
cucm_download_axl_toolkit |
Download AXL WSDL/XSD schemas from a CUCM node into the local schemas cache |
cucm_download_ris_toolkit |
Download RIS WSDL schemas from a CUCM node into the local schemas cache |
cucm_get_version |
Get the CUCM version of a node (via AXL) |
cucm_list_axl_operations |
Introspect the AXL WSDL β list available SOAP operations, optionally filtered |
cucm_list_credentials |
List configured CUCM hosts (AXL + OS, + phone / RoomOS when the sub-module is loaded) |
cucm_os_delete_credentials |
Delete OS Admin CLI credentials for a CUCM host |
cucm_os_run_command |
Execute a VOS CLI command via SSH on a CUCM node |
cucm_os_store_credentials |
Store OS Admin CLI (SSH) credentials for a CUCM host |
cucm_os_trust_fingerprint |
Trust or reject the SSH host fingerprint for a CUCM node |
cucm_os_update_credentials |
Update OS Admin CLI credentials for a CUCM host |
cucm_restart_feature_service |
Restart a feature service (e.g. Cisco Tftp) on one node via Serviceability (ControlCenterServices) β platform services: CLI utils service restart |
cucm_risport_query |
Query real-time registration status (IP, node) of one or several devices via RIS (RisPort70) |
cucm_store_credentials |
Store CUCM AXL (HTTPS/REST) credentials for a host |
cucm_update_credentials |
Update CUCM AXL credentials for a host |
AXL / RIS schema management
cucm_download_axl_toolkit and cucm_download_ris_toolkit pull WSDL/XSD files directly from the CUCM publisher. Schemas must be downloaded before the corresponding AXL or RIS operations can be used for that CUCM version.
CUCM sub-module β IP phones (SERVER_CUCM_PHONES_ENABLED)¶
Loaded when SERVER_CUCM_PHONES_ENABLED='1' (default). Screenshot, web information pages and text message: Cisco IP Phones 88xx / 98xx only, through the phone web server (HTTPS, HTTP Basic); credentials are stored as cucm-phone entries. Firmware upgrade campaigns (78xx / 88xx / 98xx, ATA 19x, wireless 8821 / 840 / 860) go through AXL and RisPort only (CUCM credentials).
| Tool | Description |
|---|---|
cucm_phone_delete_credentials |
Delete phone web access credentials |
cucm_phone_screenshot |
Capture a screenshot from a Cisco IP Phone display (returns PNG) |
cucm_phone_send_message |
Push a text message to one or several Cisco IP Phones (88xx/98xx) |
cucm_phone_store_credentials |
Store phone web access credentials (HTTP Basic) |
cucm_phone_update_credentials |
Update phone web access credentials |
cucm_phone_web_info |
Read the phone web information pages, parsed (device, network, ports + CDP/LLDP neighbour, RTP streams, status messages, logs...): one page, a list or all, compact / summary output, UTC time stamps, ITL/CTL trust list audit (optional comparison with CUCM), several phones at once (ip_phones, fleet trust_summary) |
cucm_phone_upgrade_campaign_create |
Firmware upgrade campaign: read-only inventory (listPhone, RisPort, ITL status per phone, Device Defaults), exclusions, source versions per model, pilot + waves plan, duration estimate (draft) |
cucm_phone_upgrade_campaign_start |
Start a draft campaign after the user's single confirmation: server-side waves (Phone Load Name + restartPhone) and RisPort monitoring |
cucm_phone_upgrade_campaign_status |
Campaign progress (waves, counters, attention list) and final report; restarts a lost driver |
cucm_phone_upgrade_campaign_control |
Suspend / resume / abort a campaign, align Device Defaults, re-check postponed phones |
cucm_phone_upgrade_campaign_list |
List the phone upgrade campaigns of the current client |
CUCM sub-module β RoomOS codecs (SERVER_CUCM_ROOMOS_ENABLED)¶
Loaded when SERVER_CUCM_ROOMOS_ENABLED='1' (default). Cisco RoomOS devices (Room / Desk / Board / Codec) driven through their xAPI over HTTPS (/getxml for reads, /putxml for writes and commands). Credentials are stored as cucm-roomos entries: one entry on the CUCM host is the cluster default, an entry on a codec IP overrides it for that codec.
| Tool | Description |
|---|---|
cucm_roomos_store_credentials |
Store RoomOS xAPI credentials (host = CUCM node for the cluster default, or codec IP for a per-codec override) |
cucm_roomos_update_credentials |
Update RoomOS xAPI credentials |
cucm_roomos_delete_credentials |
Delete RoomOS xAPI credentials |
cucm_roomos_xapi_lookup |
Search the bundled xAPI reference (RoomOS 26.9.1): paths, parameters, value spaces, roles β no codec access. Mandatory before any write unless a prompt gives the exact command |
cucm_roomos_get_info |
Codec identity: product, software version, serial number, uptime |
cucm_roomos_xstatus |
Read an xStatus path (/getxml) |
cucm_roomos_xconfiguration_get |
Read an xConfiguration path (/getxml) |
cucm_roomos_xconfiguration_set |
Set one xConfiguration leaf (/putxml) |
cucm_roomos_xcommand |
Run one xCommand with its parameters (/putxml) β e.g. local phonebook, standby, dial |
cucm_roomos_send_message |
Display an on-screen message on one or several codecs (UserInterface Message Alert Display) |
cucm_roomos_trust_check |
ITL / CTL conformity of codecs against their CUCM TFTP node (SHA-1 fingerprints compared, not mere presence) β mandatory before a software upgrade |
cucm_roomos_campaign_create |
Create a RoomOS software upgrade campaign: persistent per-client journal + server-side monitoring settings (status draft until the single confirmation) |
cucm_roomos_campaign_snapshot |
Read the campaign codecs (RisPort + /Status + Navigator profile): eligibility, registration, identity, Room Navigator, availability |
cucm_roomos_campaign_record |
Journal a decision or fact: single confirmation, suspension / resume / closure, device exclusion, previous load, AXL trigger failure, Device Defaults review |
cucm_roomos_campaign_start_upgrade |
Gate called immediately before updatePhone + applyPhone / restartPhone: re-checks the codec, opens the attempt and starts the server-side monitor |
cucm_roomos_campaign_align_load |
Align the Phone Load Name of a codec already on target without software deployment (automatic, verified target load, non-blocking; updatePhone + read-back only, no apply / restart, no-restart check) |
cucm_roomos_campaign_status |
Campaign state, server-side wait for the next monitoring cycle (β€ 50 s), final report rows, device outcome apart from campaign state, next action |
cucm_roomos_campaign_list |
List the upgrade campaigns of the current client (resume from a new session) |
RoomOS xAPI permissions
RoomOS calls are checked against the cucm.roomos section of the client profile: allowed_prefixes (e.g. get Status, get Configuration, set Configuration, Command Phonebook). Sensitive operations (Command SystemUnit FactoryReset, Command SystemUnit SoftwareUpgrade, Command Macros, Command UserManagement, Command Security, Command Provisioning, set Configuration Network, set Configuration Security, β¦) are shown in the same list but are blocked by default (red tiles): they are never granted by a broader prefix such as Command, only by an explicit entry. Multiline commands (macros, UI extensions, certificates) are not supported.
IMP Module¶
| Tool | Description |
|---|---|
imp_axl_call |
Execute an AXL SOAP operation |
imp_check_connectivity |
Check AXL and SSH connectivity to an IMP host β returns per-service latency |
imp_delete_credentials |
Delete IMP AXL credentials for a host |
imp_download_axl_toolkit |
Download AXL WSDL/XSD schemas from an IMP node into the local schemas cache |
imp_get_version |
Get the IMP version of a node (via AXL) |
imp_list_axl_operations |
Introspect the AXL WSDL β list available SOAP operations, optionally filtered |
imp_list_credentials |
List configured IMP hosts (AXL + OS) for the current client |
imp_os_delete_credentials |
Delete OS Admin CLI credentials for an IMP host |
imp_os_run_command |
Execute a VOS CLI command via SSH on an IMP node |
imp_os_store_credentials |
Store OS Admin CLI (SSH) credentials for an IMP host |
imp_os_trust_fingerprint |
Trust or reject the SSH host fingerprint for an IMP node |
imp_os_update_credentials |
Update OS Admin CLI credentials for an IMP host |
imp_store_credentials |
Store IMP AXL (HTTPS/REST) credentials for a host |
imp_update_credentials |
Update IMP AXL credentials for a host |
CUC Module¶
| Tool | Description |
|---|---|
cuc_check_connectivity |
Check CUPI and SSH connectivity to a CUC host β returns per-service latency |
cuc_cupi_call |
Arbitrary CUPI REST call (GET / POST / PUT / DELETE under /vmrest/) |
cuc_cupi_list |
Paginated CUPI listing β GET /vmrest/<resource> with optional query/sort/page |
cuc_delete_credentials |
Delete CUPI credentials for a CUC host |
cuc_get_version |
Get CUC product version via GET /vmrest/version/product |
cuc_list_credentials |
List configured CUC hosts (CUPI + OS) for the current client |
cuc_os_delete_credentials |
Delete OS Admin CLI credentials for a CUC host |
cuc_os_run_command |
Execute a VOS CLI command via SSH on a CUC node |
cuc_os_store_credentials |
Store OS Admin CLI (SSH) credentials for a CUC host |
cuc_os_trust_fingerprint |
Trust or reject the SSH host fingerprint for a CUC node |
cuc_os_update_credentials |
Update OS Admin CLI credentials for a CUC host |
cuc_store_credentials |
Store CUPI (REST) credentials for a CUC host |
cuc_update_credentials |
Update CUPI credentials for a CUC host |
CUPI vs AXL
Cisco Unity Connection does not expose AXL/SOAP. All provisioning and read
operations go through CUPI (Cisco Unity Provisioning Interface, REST at
https://<host>:8443/vmrest/). There is no WSDL toolkit to download and no
cluster abstraction β credentials and operations are managed per host.
Common Module¶
| Tool | Description |
|---|---|
common_download_report |
Download a single report file inline via MCP (PDF as binary blob, Markdown as text) |
common_export_report_pdf |
Export a Markdown report to PDF via WeasyPrint |
common_list_reports |
List all reports (PDF and Markdown) available for the authenticated client |
common_read_report |
Read report content (chunked for large files) |
common_write_report |
Write content to a Markdown report. Modes: create, append, overwrite, resume, insert_after |
Report modes
createβ fails if file exists; prevents accidental overwriteappendβ adds content at the end of an existing fileoverwriteβ replaces file content entirelyresumeβ resumes an in-progress report from the last written sectioninsert_afterβ inserts content after a specified anchor section
Infra Module¶
These tools are available regardless of license tier and require only a valid Bearer token.
| Tool | Description |
|---|---|
infra_get_doc |
Retrieve the full content of a doc/resource by name |
infra_get_my_permissions |
Authoritative RBAC matrix for the calling client (per product / per service allowlists & rate limits) |
infra_get_prompt |
Retrieve the full content of a prompt by name |
infra_health |
Liveness/readiness probe β status, ready, license state, server name, uptime |
infra_init_session |
MANDATORY first call β returns the full tool/prompt catalogue and the client's effective RBAC matrix |
infra_list_available_products |
Licensed products vs. the calling client's product scope (and the out-of-scope diff) |
infra_list_docs |
List all available MCP resources/docs (filtered by RBAC product scope) |
infra_list_prompts |
List all available prompts (filtered by RBAC product scope) |
infra_metrics |
Raw Prometheus metrics (counters, gauges, histograms) for the MCP server |
infra_server_status |
Full server status β server, license, backup, requests (per-category counters), security (TLS, OAuth) |
Prompt and doc tools for non-prompt clients
Most MCP clients do not support the native prompts/list / prompts/get or resources/list / resources/read capabilities.
The infra_list_prompts / infra_get_prompt and infra_list_docs / infra_get_doc tools provide the same content via standard MCP tools,
ensuring all clients can access procedures, audit workflows and reference guides regardless of their native capability support.
MCP Prompts Reference¶
Prompts are guided multistep workflows. The AI agent loads a prompt and follows its instructions, autonomously calling tools and consulting resources to complete the workflow.
| Prompt | Module | Description |
|---|---|---|
cuc_procedure |
CUC | β οΈ Mandatory pre-flight β required CUPI (REST) and SSH workflows to read before any CUC operation. |
cuc_security_audit |
CUC | Cisco Unity Connection security audit covering VOS hardening, CUPI/REST exposure, voicemail security and TLS/certificate posture. Produces a Markdown report with PDF export. |
cucm_procedure |
CUCM | β οΈ Mandatory pre-flight β required AXL, RIS and SSH workflows, terminal model / IP resolution and sub-module routing, to read before any CUCM operation. |
cucm_phone_procedure |
CUCM (phones) | β οΈ Mandatory pre-flight for IP phone operations (credentials, screenshot, web information pages, text message). Loaded with the IP phones sub-module. |
cucm_roomos_procedure |
CUCM (RoomOS) | β οΈ Mandatory pre-flight for RoomOS codec operations: credentials (cluster default / per-codec override), mandatory xAPI lookup, read/write rules, phonebook, messages. Loaded with the RoomOS sub-module. |
cucm_security_audit |
CUCM | Automated CUCM security audit based on the Cisco Security Guide Release 15. Executes a structured sequence of AXL queries, SSH commands, and RIS checks. Produces a Markdown report with PDF export. |
imp_procedure |
IMP | β οΈ Mandatory pre-flight β required AXL and SSH workflows to read before any IMP operation. |
imp_security_audit |
IMP | Equivalent security audit workflow for IMP nodes. Covers IM & Presence-specific security controls and Cisco hardening guidance. |
Prompt requirements
Security audit prompts require an admin or auditor profile. They invoke multiple tools in sequence β ensure the profile's rate limits accommodate the full audit workload.
Prompt compatibility
All prompts listed above are also accessible via the infra_list_prompts and infra_get_prompt tools for MCP clients that do not support native prompts (Cursor, Continue, Copilot, etc.).
Security-audit orchestration sub-prompts
The CUCM audit is internally split into chapter sub-prompts (cucm_security_audit_ch01_02 β¦ cucm_security_audit_ch17b) plus cucm_security_audit_report. These are invoked by cucm_security_audit and are not meant to be called directly.
Guided Workflows by Product¶
MCP prompts the AI agent follows step by step:
| Product | Workflow (MCP prompt) | Description |
|---|---|---|
| CUCM | cucm_security_audit |
Configuration security audit based on the Cisco Security Guide (AXL, SSH and RIS checks), Markdown report with PDF export. |
| CUCM | cucm_cop_file_install_workflow |
COP files installation (patches, device packs, phone / RoomOS firmware) on a CUCM cluster: precheck, installation, progress monitoring. |
| CUCM β Phones | cucm_phone_software_upgrade_workflow |
IP phone firmware upgrade campaign: prerequisites (COP, loads per model, TFTP restart), waves, Device Defaults, automatic monitoring, persistent journal, final report. |
| CUCM β Phones | cucm_phone_blf_edit_workflow |
Add, modify or remove a BLF speed dial on a Cisco IP phone. |
| CUCM β RoomOS | cucm_roomos_software_upgrade_workflow |
RoomOS software upgrade campaign through CUCM: ITL/CTL and Room Navigator checks, automatic monitoring, persistent journal, final report. |
| CUCM β RoomOS | cucm_roomos_local_phonebook_edit_workflow |
List, add, modify or remove folders and contacts in the local phonebook of a RoomOS device. |
| IMP | imp_security_audit |
IM & Presence configuration security audit, Markdown report with PDF export. |
| CUC | cuc_security_audit |
Unity Connection security audit (VOS hardening, CUPI exposure, voicemail security, TLS/certificates), Markdown report with PDF export. |
Each product also exposes a mandatory instruction prompt (cucm_procedure, cucm_phone_procedure, cucm_roomos_procedure, imp_procedure, cuc_procedure).
Additional workflows can be created as custom prompts from the Admin Web UI.
MCP Resources Reference¶
Resources are embedded read-only reference documents that the AI agent can consult during tool-calling workflows. They are served via the MCP resource protocol. All resources share the docs:// scheme, with the module name as the first path segment (docs://<module>/β¦).
CUCM Resources:
| URI Pattern | Content |
|---|---|
docs://cucm/cli-guide/* |
Cisco CUCM VOS CLI command reference |
docs://cucm/security-guide/* |
Cisco CUCM Security Guide chapters (Release 15) |
docs://cucm/roomos-xapi-guide/* |
Cisco RoomOS xAPI reference (RoomOS 26.9.1), one chapter per xAPI domain (Audio, Conference, Phonebook, UserInterface, β¦) plus an overview of the HTTPS xAPI transport β loaded with the RoomOS sub-module |
IMP Resources:
| URI Pattern | Content |
|---|---|
docs://imp/cli-guide-readonly/* |
Cisco IMP VOS CLI command reference (show/utils/file/run/set/unset/delete/license) |
docs://imp/security-guide/* |
Cisco IMP Security Guide chapters |
CUC Resources:
| URI Pattern | Content |
|---|---|
docs://cuc/cli-guide-readonly/* |
Cisco CUC VOS CLI command reference (show/utils/file/run/set/unset/delete/license) |
docs://cuc/cupi/reference |
CUPI REST endpoint catalogue β verbs, payloads, pagination, examples (CUC 14 & 15) |
docs://cuc/security-guide/* |
Cisco CUC Security Guide chapters (Release 15) (when packaged) |
HTTP Endpoints Reference¶
Endpoints of the MCP listener (https://<host>:<MCP_SERVER_PORT>, 8443 by default).
| Method | Endpoint | Auth Required | Description |
|---|---|---|---|
GET |
/.well-known/oauth-authorization-server |
None | OAuth 2.0 Authorization Server Metadata (RFC 8414) β OAuth modes only |
GET |
/.well-known/oauth-protected-resource |
None | OAuth 2.0 Protected Resource Metadata (RFC 9728) β OAuth modes only |
GET |
/.well-known/oauth-protected-resource/mcp |
None | OAuth 2.0 Protected Resource Metadata β MCP path variant (RFC 9728) β OAuth modes only |
GET |
/authorize |
None | OAuth 2.1 authorization endpoint β serves the login page (RFC 6749 Β§3.1, RFC 7636 PKCE) β OAuth modes only |
POST |
/authorize |
Client ID + client secret (login form) | Processes the login form, checks the redirect_uri allow-list, redirects with an authorization code β OAuth modes only |
GET |
/health |
None | Liveness / readiness probe β always HTTP 200; JSON with status, ready, license, maintenance, server, uptime_s |
POST / GET / DELETE |
/mcp/ |
Bearer token | MCP protocol endpoint (Streamable HTTP transport) |
GET |
/metrics |
Bearer token | Prometheus metrics (text exposition format) |
POST |
/revoke |
Bearer token | Token revocation (RFC 7009) β a client can only revoke its own tokens β OAuth modes only |
GET |
/status |
Bearer token | Full server status JSON (server, license, backup, requests, security) |
POST |
/token |
Client secret (Basic or form) or PKCE verifier | OAuth 2.1 token issuance β client_credentials or authorization_code (PKCE) grant β OAuth modes only |
MCP endpoint methods
The /mcp/ endpoint accepts POST (send message), GET (open SSE stream), and DELETE (close session) as defined by the MCP Streamable HTTP transport specification.
OAuth endpoints
OAuth modes only endpoints are exposed only when the global authentication mode is oauth2 or jwt+oauth2 (see Authentication Modes). In jwt mode they are not registered.
Admin Web UI listener
The Admin Web UI is served by a separate HTTPS listener (https://<host>:<ADMIN_UI_PORT>/admin/, 9443 by default), protected by its own source-IP allow-list and session authentication (see Security β Admin Web UI). It exposes no API intended for MCP clients.
Audit Log Event Reference¶
The audit log is a dedicated file, logs/audit.log, with its own rotation settings (Logging β Audit logs rotation). It contains one JSON object per line and can be browsed and filtered from the Audit page of the Admin Web UI.
{"timestamp": "2026-10-05 19:25:45,532", "type": "AUDIT", "client": "alice", "profile": "admin", "status": "ALLOWED", "host": "cucm-pub.example.com", "action": "cucm/axl/getPhone"}
Common Fields¶
| Field | Description |
|---|---|
timestamp |
Server-local timestamp (YYYY-MM-DD HH:MM:SS,mmm) |
type |
Always AUDIT |
status |
Event outcome β see the tables below |
action |
Event category and operation, as <category>/<operation> (e.g. auth/verify, cucm/axl/getPhone, adminui/settings-edit) |
client |
MCP client name; server for internal events, adminui for Admin Web UI events, unknown when the caller is not identified |
profile |
RBAC profile of the client (admin profile for Web UI events); system for internal events, none when unknown |
source_ip |
Source IP address of the request (src on Admin Web UI events) |
host |
Target Cisco UC node (or terminal), server for server-side checks |
reason |
Failure or rejection reason, when applicable (e.g. token_expired, invalid_client_secret, redirect_uri_not_whitelisted) |
Other fields depend on the event: tool, prompt, uri, error_type, user (admin login), key (setting), fingerprint, scope, grant, jtiβ¦
Authentication Events¶
action |
status values |
Logged when |
|---|---|---|
auth/verify, token/verify |
AUTH_SUCCESS, AUTH_FAILED, AUTH_REVOKED, AUTH_BLOCKED |
Every MCP bearer-token verification (reason: invalid_token, token_expired, token_malformed, subject_not_in_auth_clientsβ¦) |
oauth/authorize |
AUTH_CODE_ISSUED, AUTH_FAILED, AUTH_BLOCKED |
OAuth login form submitted (authorization code + PKCE flow) |
oauth/token |
TOKEN_ISSUED, AUTH_FAILED, AUTH_BLOCKED |
OAuth token request (grant: client_credentials / authorization_code) |
oauth/revoke |
TOKEN_REVOKED, TOKEN_REVOKE_NOOP, TOKEN_REVOKE_DENIED, TOKEN_REVOKE_FAILED |
Token revocation request (RFC 7009) |
| (none) | IP_BLACKLISTED, IP_RELEASED |
Fail2Ban: source IP blacklisted after too many failures (or by an administrator) / released |
client/sync |
TOKEN_CREATED, TOKEN_RENEWED, TOKEN_REMOVED, SECRET_CREATED, SECRET_REMOVED, TOKEN_VERIFY_ERROR |
Client credentials provisioned, renewed or purged at startup |
MCP Call Events¶
Every MCP request is logged twice: once by the RBAC / rate-limit gate of the operation, once for the call itself.
action |
status values |
Logged when |
|---|---|---|
<product>/<protocol>/<operation> |
ALLOWED, DENIED, RATE_LIMITED, RATE_LIMITED_GLOBAL |
RBAC and rate-limit check of an operation (e.g. cucm/axl/updateLine, imp/ssh/show version active, common/report/write) |
(none β field tool) |
TOOL_CALLED, TOOL_FAILED |
MCP tool invocation (TOOL_FAILED carries error_type and reason) |
(none β field prompt) |
PROMPT_READ, PROMPT_FAILED |
MCP prompt read |
(none β field uri) |
RESOURCE_READ, RESOURCE_FAILED |
MCP resource read |
input_validation |
REJECTED |
Tool parameters rejected by input validation |
mcp/<method> |
MAINTENANCE_REJECTED |
Request refused while maintenance mode is on |
cucm/phone/β¦, cucm/roomos/β¦, cucm/serviceability/restart <service> |
SENT, PARTIAL, EXECUTED, APPLIED, FAILED, SERVICE_<STATUS> |
Terminal actions (text message, xAPI command / configuration) and feature-service restarts |
Status values
RATE_LIMITED is the per-client limit (RBAC profile); RATE_LIMITED_GLOBAL is the optional global limit per destination host, all clients combined.
Credential & Host Trust Events¶
action |
status values |
Logged when |
|---|---|---|
credentials/<service> |
STORED, UPDATED, DELETED |
A client stores, updates or deletes Cisco UC credentials |
ssh/fingerprint |
TRUSTED |
An SSH host fingerprint is trusted (field fingerprint, SHA-256) |
Report Events¶
action |
status values |
Logged when |
|---|---|---|
report/<type> |
WRITTEN |
Report written (field mode, file) |
report/<type> |
EXPORTED |
Report exported to PDF |
Server, License & Integrity Events¶
action |
status values |
Logged when |
|---|---|---|
server/start, server/stop |
STARTED, STOPPED, FAILED, MCP_DISABLED |
Server start / stop; MCP disabled by the license state |
startup |
SSL_DISABLED |
Certificate verification towards a Cisco UC product is off |
license/verify, license/watchdog, license/import, license/delete |
LICENSE_OK, LICENSE_GRACE, LICENSE_EXPIRED, LICENSE_INVALID, LICENSE_MISSING, LICENSE_EXCEEDED, LICENSE_LOST, LICENSE_IMPORTED, LICENSE_DELETED |
License check at startup, periodic watchdog, import / delete from the Web UI |
integrity/watchdog |
INTEGRITY_OK, INTEGRITY_VIOLATION, INTEGRITY_ERROR |
Software integrity check (startup and periodic) |
transport/<method> |
TRANSPORT_BLOCKED |
Invalid Host or Origin header (DNS rebinding protection) |
Admin Web UI Events¶
Every Admin Web UI action is logged with client = adminui, the administrator login in user, its admin profile in profile and the source IP in src.
action |
Logged when |
|---|---|
adminui/start |
Admin UI listener started |
adminui/login, adminui/password-change, adminui/access |
Sign-in (SUCCESS, FAILED, LOCKED), password change, request refused (source IP not allowed or blacklisted) |
adminui/settings-edit, -revert, -revert-all, -apply, -new-ack |
Setting staged, reverted, applied with restart, new setting acknowledged |
adminui/file-edit, file-delete, file-delete-pair, file-hostkey-scan, ca-bundle-add, ca-bundle-remove, key-generate, csr-generate, secret-generate, sftp-password, rsa-regenerate |
Key, certificate, CA bundle and secret management |
adminui/client-create, -edit, -delete, -reveal, -reset-tokens, client-profile-add, -edit, -delete, reveal-template |
MCP clients and client profiles |
adminui/admin-create, -edit, -delete, -reset-password, admin-profile-create, -delete, admin-rights-save |
Administrators and admin profiles |
adminui/prompts-save, -import, -delete, -toggle |
Custom prompts |
adminui/backup-now, -restore, -download, -delete, sftp-export-now, reports-delete |
Backups and reports |
adminui/license-import, license-delete |
License management |
adminui/system-maintenance-*, system-blacklist, system-unblacklist, system-reset-stats |
System & reload page |
adminui/show-tech-run, show-tech-delete, tools-connectivity, tools-add-to-client |
Diagnostics and tools |
Admin UI events use the statuses SUCCESS, OK, FAILED, DENIED, LOCKED, STARTED and CANCELLED.
Log injection
Every logged value is sanitized (control characters escaped) before being written (CWE-117).
Error Types Reference¶
| Error / Status | HTTP Status | Meaning |
|---|---|---|
AXLOperationError |
400 | AXL SOAP operation failed or returned a fault from Cisco UC |
AXLValidationError |
400 | AXL input validation failed (bad SQL, path traversal, etc.) |
CredentialError |
400 | Credential store error (not found, decryption failure) |
OAuthError |
400 | OAuth 2.1 token request failed (invalid client, bad grant type, etc.) |
RISQueryError |
400 | RIS/Performance query returned an error from Cisco UC |
RoomOSError |
400 | RoomOS codec xAPI call (getxml / putxml) failed |
ServiceabilityError |
400 | CUCM Serviceability (Control Center services) call failed |
SSHCommandError |
400 | SSH command failed or connection was refused |
UCPlatformError |
400 | Base error for Cisco UC platform failures (subclasses below) |
WSDLError |
400 | WSDL/schema download or parsing failed |
AUTH_FAILED (malformed) |
400 | Token cannot be decoded (TokenMalformedError, reason token_malformed) |
AUTH_FAILED (expired) |
401 | Token has passed its expiry time (TokenExpiredError, reason token_expired) |
AUTH_FAILED |
401 | Missing token, invalid signature or claims (TokenInvalidError) |
AUTH_REVOKED |
401 | Token has been explicitly revoked via /revoke |
ProfilePermissionError |
403 | Operation not permitted by the client's RBAC profile |
TokenForbiddenError |
403 | Token is valid but its subject is not a declared client (deleted client) |
AUTH_BLOCKED |
429 | Source IP is currently blacklisted by Fail2Ban |
RateLimitError |
429 | Per-client rate limit exceeded for this product/service β retry after N seconds |
RateLimitError (global) |
429 | Global per-host limit exceeded (all clients) for this product/service on a Cisco node |
BackupError |
500 | Backup or restore operation failed |
ConfigError |
500 | Missing or invalid configuration setting detected at startup |
IntegrityError |
500 | Software integrity check failed β tampered file detected |
ReportError |
500 | Report generation, reading, or PDF export failed |
UpgradeError |
500 | Upgrade tool cannot proceed (e.g. unrecognised release version) |
LicenseError |
503 | License invalid or expired β product modules unavailable |
Rate limit retry
On a RATE_LIMITED or RATE_LIMITED_GLOBAL (HTTP 429) response, the Retry-After header indicates the number of seconds to wait before retrying. The per-client limit is defined in the RBAC profile; the optional global limit (all clients, per destination host) is configured in the Admin Web UI (Global settings β Rate limiting and the Rate limiting tab of each product) and is checked after the per-client gate.
Standards & RFC Compliance¶
| Standard | Coverage |
|---|---|
| CWE-117 | Log injection prevention in structured log output |
| NIST FIPS 180-4 | SHA-256 / SHA-512 hash algorithms |
| NIST SP 800-132 | PBKDF2 β 600,000 iterations, SHA-512 |
| NIST SP 800-38D | AES-256-GCM authenticated encryption |
| OWASP Top 10 | Input validation, transport security, injection prevention |
| RFC 4251β4254 | SSH Protocol Architecture, Transport, Authentication, Connection |
| RFC 5280 | X.509 Certificate and CRL Profile |
| RFC 6585 | HTTP 429 Too Many Requests |
| RFC 6749 | OAuth 2.0 Authorization Framework (client_credentials and authorization_code grants) |
| RFC 6750 | Bearer Token Usage in HTTP requests |
| RFC 7009 | OAuth 2.0 Token Revocation |
| RFC 7518 | JSON Web Algorithms (JWA) β RS256 signing algorithm |
| RFC 7519 | JSON Web Tokens (JWT) |
| RFC 7617 | HTTP Basic Authentication |
| RFC 7636 | Proof Key for Code Exchange (PKCE) β S256 code challenge method |
| RFC 8017 | RSA-PSS signing & RSA-OAEP encryption (PKCS#1 v2.2) |
| RFC 8018 | PBKDF2 β Password-Based Key Derivation Function 2 |
| RFC 8259 | JSON |
| RFC 8414 | OAuth 2.0 Authorization Server Metadata |
| RFC 8446 / 5246 | TLS 1.3 / TLS 1.2 |
| RFC 9068 | JWT Profile for OAuth 2.0 Access Tokens |
| RFC 9110 | HTTP Semantics |
| RFC 9728 | OAuth 2.0 Protected Resource Metadata |
Scripts Reference¶
Standalone scripts in scripts/. Run from the project root with python scripts/<name>.py.
| Script | Description |
|---|---|
admin_set_password.py |
Set or reset an Admin Web UI account password (bcrypt, password policy enforced); prompts for the password when --password is omitted |
backup_restore.py |
Interactive restore from encrypted local or SFTP backup archives |
certificate_generate_csr.py |
Generate a TLS CSR with proper SAN extension (--target mcp\|adminui); reuses existing private key if present |
encrypt_sftp_password.py |
Encrypt the SFTP backup password (BACKUP_SFTP_PASSWORD_ENC) β CLI alternative to the Set password link of the Web UI |
export_mcp_definitions.py |
Export all MCP tools, prompts, and resources to JSON for static analysis |
healthcheck.py |
Container HEALTHCHECK probe (loopback only): MCP /health, or the Admin UI when the MCP listener is disabled by the license |
license_checker.py |
Decode and display secrets/license.jwt β works without starting the server |
rotate_rsa_keys.py |
Interactive RSA key pair rotation: archives the old key, forces token regeneration at next startup |
show_tech.py |
Collect a diagnostic bundle (logs, config snapshot, status) for support |
update_manifest.py |
Pre-commit hook: regenerate the SHA-512 integrity manifest before each commit |
upgrade.py |
Upgrade tool β reconciles the configuration with the new release (run by tolk-setup.sh) |
Test Scripts¶
| Script | Description |
|---|---|
tests_check_mcp_scan.py |
Validate mcp-scanner JSON output against a known false-positive allowlist |
tests_cucm_helper.py |
Internal helper for tests_run.py β isolated subprocess for CUCM operations |
tests_run.py |
Interactive test runner β unit tests, then optionally integration tests |
tests_setup_credentials.py |
Encrypt and store Cisco UC credentials (CUCM, IP phones, IMP, RoomOS lab codec) for the pytest integration-test client |
Library Modules Reference¶
Internal modules in lib/. Not meant to be executed directly.
| Module | Description |
|---|---|
audit_middleware.py |
FastMCP middleware that writes a structured audit entry for every MCP tool call |
auth.py |
JWT verifier with audit logging, token expiry check, and fail2ban integration |
auth_clients.py |
Parser and validator of the declared MCP clients (name:subject:profile[:auth_mode]) and their authentication modes |
auth_rate_limiter.py |
Sliding-window fail2ban: temporary IP blacklist after repeated authentication failures |
backup.py |
Periodic encrypted backup watchdog β AES-256-GCM archive + RSA-4096 OAEP key wrapping |
ca_trust_store.py |
Read-only inspection of a per-product CA trust store (directory or bundle file) |
client_activity.py |
Per-client last-connection tracker (secrets/client_activity.json) |
client_credentials.py |
One-time reveal of a client's credentials in the Web UI (View credentials) |
client_editor.py |
Staged create / edit / delete of MCP clients from the Web UI |
client_reset.py |
Live revocation of a client's active credentials (Reset tokens) |
credentials.py |
Fernet-based per-client credential encryption/decryption with PBKDF2-derived keys |
crypto.py |
Server salt management and per-client PBKDF2 key derivation for Fernet encryption |
csr.py |
Shared TLS Certificate Signing Request construction (CN, SANs) for the MCP and Admin UI listeners |
cucm_cli_reference.py |
CUCM 15 reference sets displayed by the client profile editor (granted / not granted prefixes) |
custom_prompts_loader.py |
Declarative loader for per-client custom prompts (JSON store) from servers-data/<product>/custom-prompts/ |
env_editor.py |
Write side of the Web UI settings: staged edits, enum / range validation, snapshots, revert, pending-restart diff, AUTH_MODE β clients consistency check |
env_variables.py |
Configuration loader and typed configuration accessors used across all modules |
exceptions.py |
Custom exception classes (ConfigError, LicenseError, IntegrityError, β¦) |
garbage_collector.py |
Nightly housekeeping daemon (03:15 server time + one pass at startup): purges expired data and re-verifies the license |
http_metrics_middleware.py |
ASGI middleware incrementing http_requests_total for every HTTP response |
integrity.py |
SHA-512 manifest verification against the RSA-PSS signed manifest.json |
ip_targets.py |
Normalization and matching of blacklist targets (single IP or CIDR subnet), shared by Fail2Ban and the admin login throttle |
license.py |
JWT-based license verification: hostname binding, expiry, grace period, product scope |
log_setup.py |
JSON rotating loggers for app.log and audit.log + optional colored console handler |
lru_cache.py |
Tiny thread-safe bounded LRU cache used by the Zeep/WSDL client caches |
maintenance.py |
Maintenance mode state (persisted on/off switch) and per-client MCP activity tracking |
maintenance_middleware.py |
Maintenance enforcement: ASGI 503 on new MCP sessions + FastMCP refusal of idle clients |
metrics.py |
Prometheus metrics definitions β counters, gauges, and histograms for all subsystems |
metrics_history.py |
Persistent long-term history of request volumes per pipeline stage (Statistics page) |
new_settings.py |
Settings added by the upgrade tool, flagged as new (blue) in the admin UI until acknowledged, edited or 7 days old |
oauth.py |
OAuth 2.1 server helpers: PKCE auth codes, token issuance, client secret management |
oauth_cors.py |
ASGI middleware adding CORS headers to the public OAuth 2.1 endpoints for browser-based clients |
profiles.py |
RBAC profile loading, hot-reload on file change, and per-operation permission evaluation |
public_url.py |
MCP_SERVER_PUBLIC_URL: public base URL (reverse proxy / VIP) advertised in OAuth metadata and client URLs; implicitly allowed host / origin |
rate_limiter.py |
Sliding-window rate limiter: per-client and optional global (all-clients, per destination host) |
retry.py |
Exponential backoff retry decorator for transient network/connection errors |
reveal_template.py |
Optional site-customizable template of the client credentials reveal block |
rsa_key_cache.py |
Process-wide cache for RSA public/private keys to avoid repeated disk reads and parsing |
sanitize.py |
Input sanitization utilities shared across MCP tool handlers |
secure_files.py |
Safe view / edit of the key and certificate files referenced by the configuration (Web UI View / Edit) |
show_tech_store.py |
Storage and orchestration of on-demand show-tech bundles (Logs β Diagnostics) |
ssh_pool.py |
SSH connection pool with adaptive scaling and idle TTL β multiplexes sessions to CUCM/IMP nodes |
stats_snapshot.py |
Machine-readable statistics export, outside the Admin Web UI |
status_tracker.py |
Thread-safe in-memory stats tracker powering the /status endpoint |
sync_clients.py |
Client lifecycle management at startup: create directories, renew credentials, purge removed clients |
tls.py |
TLS certificate management: single cert/key pair per listener (self-signed or CA-signed, auto-detected), CN/SAN computation, mid-life renewal, 50% alert state |
token_blacklist.py |
Persisted JWT revocation list β stores revoked jti claims in secrets/token_blacklist.json |
tool_catalog.py |
Persisted snapshot of the full MCP tool catalog (coverage views of the Web UI) |
transport_security.py |
ASGI middleware for DNS rebinding protection via Host and Origin header validation |
trusted_proxies.py |
TRUSTED_PROXY_IPS: reverse proxies whose X-Forwarded-For identifies the real client; never blacklisted |
typeddicts.py |
Typed return shapes (TypedDict) for MCP tools and infra helpers |
upgrade.py |
Upgrade tool engine: version comparison, configuration reconciliation with the new release (new keys inserted, PROJECT_* refreshed), backup, report |
validators.py |
Pydantic input validation models for all MCP tool parameters |
Admin Web UI Modules¶
Internal modules in servers/admin/ (Admin Web UI).
| Module | Description |
|---|---|
accounts.py |
Admin account store (secrets/admins/accounts.json), bcrypt verification and password policy enforcement |
active_sessions.py |
In-memory registry of the active admin sessions (shown before a restart) |
app.py |
Starlette application: routing, session authentication, CSRF protection, per-page RBAC, language switch |
backups.py |
Backup page orchestration (system, configuration snapshots, certificates / RSA keys) |
bruteforce.py |
Admin login throttling per login and source IP, with temporary lockout |
config.py |
Loader and validator of the ADMIN_UI_* settings |
context.py |
Runtime context shared by the request handlers (configuration, TLS, session secret, license) |
env_help.py |
Per-parameter help texts (EN / FR) of the settings pages |
i18n.py |
Minimal EN / FR translation loader |
nav_icons.py |
Inline SVG navigation icons (no external asset) |
pages.py |
Page bodies (dashboard, settings, clients, administrators, statistics, systemβ¦) |
prompts_editor.py |
Custom prompts editor backend (servers-data/<product>/custom-prompts/) |
rbac.py |
Admin RBAC: per-page access matrix (none / ro / rw) and admin profile storage |
render.py |
Dependency-free HTML rendering with systematic escaping |
restart.py |
In-place service restart to apply staged settings |
security.py |
Source-IP allow-list / blacklist middleware and strict security headers (CSP, HSTSβ¦) |
server.py |
Admin UI HTTPS listener bootstrap (dedicated port) |
sessions.py |
HMAC-SHA256 signed session cookies |
stats_extra.py |
Statistics tabs: summary, errors, security, backends, trends, adoption |
stats_tops.py |
Statistics Tops tab (leaderboards derived from the audit log) |
system_info.py |
Live system metrics of the System & reload page |
tls.py |
TLS certificate resolution for the Admin UI listener (MCP certificate reuse or dedicated certificate) |
tls_preflight.py |
TLS certificate pre-checks displayed before applying changes and restarting |
tools_connectivity.py |
Tools page connectivity test (DNS, TCP, TLS, β¦) towards a CUCM, IMP, CUC node or terminal |
Glossary¶
| Term | Definition |
|---|---|
| AES-GCM | AES Galois/Counter Mode β authenticated encryption mode providing both confidentiality and integrity |
| ASGI | Asynchronous Server Gateway Interface β Python standard for async web servers and frameworks |
| AXL | Administrative XML Layer β Cisco's SOAP/XML API for UC platform configuration |
| bcrypt | Adaptive password hashing function used for OAuth client secrets and Admin Web UI passwords |
| CUC | Cisco Unity Connection β voicemail and unified messaging platform |
| CUCM | Cisco Unified Communications Manager β the primary UC call control and configuration platform |
| CUPI | Cisco Unity Provisioning Interface β REST API exposed by CUC for provisioning and read operations (/vmrest/) |
| Fernet | Symmetric authenticated encryption scheme: AES-128-CBC + HMAC-SHA256 (Python cryptography library) |
| IMP | Cisco IM & Presence Service β XMPP-based instant messaging component of the CUCM suite |
| JWT | JSON Web Token β compact, URL-safe, self-contained token format (RFC 7519) |
| MCP | Model Context Protocol β open standard for AI agent β tool server communication, maintained by Anthropic |
| PBKDF2 | Password-Based Key Derivation Function 2 β NIST-recommended key stretching algorithm (RFC 8018) |
| RBAC | Role-Based Access Control β permission model where access is governed by predefined roles |
| RIS | Real-time Information Service β Cisco API for querying live device registration status |
| RS256 | RSA Signature with SHA-256 β JWT signing algorithm (RFC 7518) |
| RSA-OAEP | RSA Optimal Asymmetric Encryption Padding β modern RSA encryption scheme (PKCS#1 v2.2, RFC 8017) |
| RSA-PSS | RSA Probabilistic Signature Scheme β modern RSA signature padding (PKCS#1 v2.2, RFC 8017) |
| SAN | Subject Alternative Name β X.509 certificate extension for binding multiple hostnames/IPs to a single certificate |
| SFTP | SSH File Transfer Protocol β secure file transfer protocol operating over an SSH connection |
| TOFU | Trust On First Use β SSH host key trust model: fingerprint is trusted on first connection and pinned for subsequent ones |
| VOS | Voice Operating System β Cisco's hardened Linux-based platform OS underlying CUCM, IMP, CUC, and other UC products |
| WSDL | Web Services Description Language β XML format describing the operations and data types of a SOAP web service |