Changelog¶
Last update: October 20, 2026
All notable changes to this project are documented in this file.
[v202612-beta3] - 2026-10-20¶
Added¶
- Upgrade tool (
tolk-setup.sh): loads the image, creates.envon first install; on upgrade, reconciles.envwith the release (new settings added in place with their default value,PROJECT_*refreshed,.envbackup,--dry-runpreview). - CUCM β RoomOS codecs support (
SERVER_CUCM_ROOMOS_ENABLED): RoomOS devices driven through their xAPI over HTTPS. cucm_phone_web_info: reads the web information pages of a Cisco 88xx/98xx IP phone, returned parsed: device, network setup, Ethernet, network/access ports (CDP/LLDP neighbour), RTP streams 1-5, status messages, debug display, console log / core dump file names, several pages (pageslist) or all pages at once, with optionalcompact(no empty fields / zero counters) andsummary(one digest per page) output. Time stamps are given in phone local time and in UTC (time_utc, from the phone IANA time zone);truncatedflags a full 10-line phone buffer. Security audit:trust_listobject (security mode, ITL/CTL file, signature, hash, TFTP/CAPF/TVS servers, last update, last DeviceTLInfo report) andcompare_cucmoption comparing the phone ITL hash with the CUCM database (tftptlinfo/devicetlinfo, AXLexecuteSQLQuery). Several phones at once withip_phones(list, exclusive withip_phone): phones read in parallel, one result per phone with an overallok/partial/errorstatus and counters,compacton by default,page="all"only withsummary, global time budget, a single batched CUCM comparison and a fleettrust_summary(distinct ITL hashes, match / mismatch / unknown phones). Same prerequisites as the screenshot (cucm-phonecredentials, Web Access enabled). New RBAC phone operationweb_info(granted to theadmin,operatorandauditorprofiles; one rate-limit slot per phone) and new settingsSERVER_CUCM_PHONE_WEB_TIMEOUT,SERVER_CUCM_PHONE_WEB_MAX_TARGETS,SERVER_CUCM_PHONE_WEB_CONCURRENCYandSERVER_CUCM_PHONE_WEB_BATCH_TIMEOUT.cucm_restart_feature_service: restarts a CUCM feature service (e.g. Cisco Tftp) on one node through the Serviceability SOAP API (ControlCenterServices).- Admin Web UI β Tools > Connectivity test: checks access to a product / device (network, TLS, credentials, APIs, SSH; ITL / CTL hash read on IP phones and RoomOS codecs, no comparison) and can add him to a client.
- Admin Web UI β Custom prompts: common end-of-workflow summary: new Append the common end-of-workflow summary option (
"summary": truein the definition file); the AI agent then ends the workflow with a short customer summary (operation, overall result, key figures, changes, attention points, remaining actions, rollback), completed by the prompt's own## Summary specificssection.
Changed¶
- Admin Web UI β
UID/GID: the container user is now shown and editable in Global settings β Server β Docker container (0= root refused). Both keys are now active in.env(default1000, same as before); on upgrade, the commented-out#UID/#GIDlines are activated in place with1000. - Admin Web UI β
AUTH_MODEconsistency: a mode more restrictive than a client's own authentication mode is now refused (the server used to fail at the next restart); switching tojwt+oauth2assigns the previous mode to every existing client; undoingAUTH_MODEor the clients alone is refused when the pair would no longer match.AUTH_MODEis now staged like the clients: the running server keeps its mode until Apply & restart. - Admin Web UI β self-signed TLS certificate past mid-life: as it is only regenerated at startup, the header tile now reads RESTART REQUIRED (link to Apply & restart), the restart banner is shown on every page and the certificate is listed as a pending change (author System).
- Admin Web UI β Backup / Restore: the SFTP export now button is disabled when no local full-system backup exists.
- Admin Web UI β sessions: Keep me signed in no longer expires on inactivity (the session remains valid for
ADMIN_UI_SESSION_REMEMBER_DAYSdays). - Admin Web UI β new settings highlighted: settings added by an upgrade are highlighted in blue (header tile, menu / tab dots, rows) until "marked as seen", edited, or after 7 days.
cucm_phone_send_message: multi-device support β one message pushed in parallel to up to 50 IP phones. Theterminal_typeargument is removed: the tool targets Cisco IP Phones 88xx / 98xx only, RoomOS codecs usecucm_roomos_send_message.cucm_risport_query: multi-device support β up to 1000 device names (or*wildcard patterns) resolved in ONE RisPort request.- CUCM β upgrade campaign journals purge: the nightly garbage collector (03:15) deletes the journals of closed (completed / aborted) or never-started campaigns older than
SERVER_CUCM_PHONE_CAMPAIGN_RETENTION_DAYS(IP phones) /SERVER_CUCM_ROOMOS_CAMPAIGN_RETENTION_DAYS(RoomOS), 30 days by default (0= never purge).
Fixed¶
- CUCM β AXL
busyLampField(BLF): a BLF to an internal DN could not be written βblfDestis mandatory in the AXL schema (Missing element blfDestwhen omitted /null) while CUCM rejects it, even empty, next toblfDirn. The server now omitsblfDestfor entries carryingblfDirnand drops the emptyblfDirn/routePartitionof external number entries inadd*/update*operations; an entry with both or none ofblfDest/blfDirnis refused before reaching CUCM. - CUCM β AXL
returnedTags:xsd:choicemembers requested with an empty value (e.g.blfDirn/routePartitionof a BLF) were silently dropped fromget*/list*requests, so CUCM returned them asnull(a BLF to an internal DN looked orphan).
Custom prompts¶
- CUCM β Phones upgrade workflow: server-driven upgrade campaigns, with ITL, automatic monitoring, persistent journal and final report.
- CUCM β RoomOS upgrade workflow: server-driven upgrade campaigns, with ITL/CTL and Room Navigator checks, automatic monitoring, persistent journal and final report.
- CUCM β RoomOS phonebook edit workflow: server-driven upgrade campaigns, with ITL/CTL and Room Navigator checks, automatic monitoring, persistent journal and final report.
- CUCM β COP File installation workflow : Deploy across the cluster or node-by-node in a sequential order.
- CUCM β Phone BLF edit workflow: two explicit entry formats β internal DN and external number.
- CUCM β all workflows: end-of-workflow customer summary enabled, with the specifics of each workflow (Phones / RoomOS upgrade, COP file installation, BLF and RoomOS phonebook edit).
Dependencies¶
- bcrypt==5.0.0
- colorlog==6.12.0
- cryptography==50.0.2
- fastmcp==3.4.9
- lxml==6.1.3
- Markdown==3.11.2
- matplotlib==3.11.2
- mcp==1.30.0
- numpy==2.5.4
- paramiko==5.1.0
- pillow==13.0.0
- prometheus_client==0.26.0
- pydantic==2.14.1
- pydantic-settings==2.16.1
- PyJWT==2.15.1
- python-dotenv==1.2.4
- python-multipart==0.0.32
- requests==2.34.2
- starlette==1.9.0
- tzdata==2026.5
- urllib3==2.8.0
- weasyprint==70.0
- zeep==4.3.3
[v202609] - 2026-09-30¶
Added¶
CUCM¶
- New tool
cucm_phone_send_message: push a text message to a Cisco IP Phone (88xx/98xx) or RoomOS endpoint display.
Security¶
- Global rate limiting : cumulative limit protecting each Cisco destination server.
- Manual IP blacklist (System page): accepts a single IP or a CIDR subnet (IPv4/IPv6), a scope (Web UI, MCP or both) and an auto-unlock duration in minutes / hours / days, or never (permanent until manually unlocked). A Web UI-scoped block denies the whole admin UI to that address; blocking your own address is refused.
- Reverse proxy support: new
TRUSTED_PROXY_IPS(trusted proxies, real client IP fromX-Forwarded-For) andMCP_SERVER_PUBLIC_URL(public URL advertised behind a VIP) settings.
Diagnostics¶
- Show tech: client details, partially masked IPv4 addresses, pending changes included.
/metrics,/statusand/health: new metrics and information (statistics, admin UI certificate).
Maintenance mode¶
- New maintenance mode to drain MCP traffic before an upgrade or restart: new sessions are refused, sessions in progress continue.
- Connected clients are refused once idle for
MAINTENANCE_IDLE_TIMEOUT_SECONDS(or afterMAINTENANCE_MAX_DRAIN_SECONDS);/healthturns tomaintenanceonce all are drained.
Admin Web UI¶
- New Admin Web UI: browser-based administration console for the Tolk server.
- Documentation help link (
?) can be edited β e.g. an internal documentation mirror. - Certificates: CSR generation with editable SANs.
Changed¶
- TLS certificate status (dashboard Security zone, System & reload, Apply & restart check, header tile): same rule for every certificate and type β green, orange once 50% of the lifetime has elapsed (renewal recommended), red when expired. CA-signed certificates no longer use the fixed 30-day threshold.
Fixed¶
- A self-signed admin UI certificate was treated as CA-signed after a restart (never renewed at mid-life, wrong status colour).
- Dashboard / header TLS status was computed once at startup; it is now evaluated live, and the header tile links to the TLS card of the System & reload page.
- Statistics βΊ Pipeline: infrastructure probes (
/health,/status,/metricsβ Docker HEALTHCHECK, monitoring, show tech) are no longer counted in the Transport, HTTP and Authentication stages, so the Pipeline stays empty after a statistics reset like the other charts. - Statistics: after a restart, the 5 min / 1 h / 24 h ranges (in-memory) lost every request recorded before it, while 7 d / 30 d / 1 y (persisted history) kept them β a longer range could show more requests than a shorter one covering the same activity. The live windows are now rebuilt from the hourly history at startup (events spread over their hour), so all ranges agree.
- Statistics: an in-place restart (Apply & restart, license reconciliation) dropped up to one minute of not-yet-saved statistics; they are now saved before the restart.
- Statistics βΊ Pipeline:
/health,/status,/metrics,/authorize(POST) and/tokenrequests were counted twice at the HTTP stage.
Dependencies¶
- bcrypt==5.0.0
- colorlog==6.12.0
- cryptography==50.0.2
- fastmcp==3.4.7
- lxml==6.1.3
- Markdown==3.11
- matplotlib==3.11.2
- mcp==1.29.0
- numpy==2.5.3
- paramiko==5.0.0
- pillow==12.3.0
- prometheus_client==0.26.0
- pydantic==2.13.5
- pydantic-settings==2.15.0
- PyJWT==2.15.1
- python-dotenv==1.2.4
- python-multipart==0.0.32
- requests==2.34.2
- starlette==1.7.0
- urllib3==2.8.0
- weasyprint==70.0
- zeep==4.3.3
- bandit==1.9.4
- freezegun==1.5.5
- httpx==0.28.1
- httpx2==2.13.1
- msgpack==1.2.3
- mypy==2.3.1
- pip==26.2.1
- pip-audit==2.10.1
- pre-commit==4.6.2
- pymupdf4llm==1.28.2
- pytest==9.1.1
- pytest-asyncio==1.4.0
- pytest-cov==7.1.0
- pytest-timeout==2.4.0
- pytest-xdist==3.8.0
- PyYAML==6.0.3
- ruff==0.16.9
[v202606] - 2026-06-25¶
Added¶
CUC (Cisco Unity Connection) β new product module¶
- New
cucproduct module, gated by the signed license claim"cuc". - Supported versions: CUC v14 & v15.
- 13 MCP tools across CUPI REST (
get_version,cupi_list,cupi_call, β¦), SSH OS Admin (os_run_command), connectivity diagnostics and credential management. - Prompts:
cuc/procedure,cuc/security_audit. - Resources: 8 VOS CLI Guide chapters, 3 optional Security Guide chapters, plus a CUPI endpoint catalogue (~80 endpoints) packaged as
docs://cuc/cupi/referenceand referenced by the CUC prompts. - Notable: CUPI client (REST
/vmrest/) with mandatory TLS verification; same RBAC and credential model as CUCM / IMP.
Other additions¶
- SSH session pooling extended
- SSH pool Prometheus metrics: live pool occupancy, command-reuse histogram, success counter.
- RBAC self-discovery for MCP clients: new tool
infra_get_my_permissions(product?)and matrix embedded ininfra_init_session. - Documentation discovery for tools-only clients: new tools
infra_list_docs()/infra_get_doc(name|uri).
Changed¶
- Misleading "read-only" wording removed from
*_axl_call,*_os_run_command,cuc_cupi_calland related listings β permissions now depend on the caller's RBAC profile. procedureprompts (CUCM / IMP / CUC) now instruct the LLM to callinfra_get_my_permissions(<product>)before any write/admin operation.
Dependencies¶
- bcrypt==5.0.0
- colorlog==6.10.1
- cryptography==49.0.0
- fastmcp==3.2.4
- lxml==6.1.1
- Markdown==3.10.2
- matplotlib==3.11.0
- mcp==1.28.0
- numpy==2.5.0
- paramiko==5.0.0
- Pillow==12.2.0
- prometheus_client==0.25.0
- pydantic==2.13.4
- pydantic-settings>=2.14.2
- PyJWT==2.13.0
- python-dotenv==1.2.2
- python-multipart==0.0.32
- requests==2.34.2
- starlette==1.3.1
- urllib3==2.7.0
- weasyprint==69.0
- zeep==4.3.3
[v202605] - 2026-05-31¶
Added¶
Core¶
- FastMCP Streamable HTTP server, configured via
.env. - Auto-bootstrap at startup: RSA-4096 key pair, server salt, client directories, JWT tokens, license verification.
- Client lifecycle sync with
AUTH_CLIENTSat every start (create / renew / purge). - HTTP endpoints:
/health,/metrics(Prometheus),/status. - Structured logging (
app.logJSON + dedicatedaudit.log).
Security¶
- Air-gapped or hybrid deployment, no cloud dependency.
- Mandatory TLS (self-signed or CA-signed).
- Client auth: RS256 bearer tokens, JWT or OAuth2 Client Credentials (with PKCE).
- RBAC with
admin/operator/auditorprofiles, customizable per client. - Per-client data isolation; credentials encrypted with a per-client Fernet key (PBKDF2-SHA512).
- Full structured audit trail with control-character sanitization.
- Transport hardening: HTTPS, DNS-rebinding protection, Host/Origin/Content-Type checks.
- SSH fingerprint + HTTPS certificate verification before any Cisco UC connection.
- Pydantic input validation on every MCP tool.
- Per-client sliding-window rate limiting and Fail2ban per-IP brute-force detection.
.env-only configuration policy.
Performance & Stability¶
- Bounded LRU caches on Zeep/WSDL clients.
- Reduced lock contention on credential storage.
Observability¶
- In-memory 24 h sliding windows, Prometheus counters for HTTP and MCP tool calls.
- Per-tool / resource / prompt failure audit lines with error type and metric increment.
- Show-tech bundle redaction extended to all sensitive key patterns.
Licensing¶
- RS256-signed offline JWT licenses (
VALID/GRACE/EXPIRED/INVALID), optional hostname binding, background watchdog, standalone CLI inspector.
Backup & Restore¶
- Periodic encrypted backups (RSA-4096 + AES-256-GCM + SHA-512 sidecar), local retention, optional SFTP export.
- Restore script with integrity verification and safe in-place replacement.
Upgrade¶
- Signed upgrade bundles with RSA-PSS verification, dry-run preview, automatic pre-upgrade backup,
.envkey-merge without overwriting customer values.
Reporting¶
- MCP tools
write_report/read_report/export_report_pdfwith Markdown output, 9 chart types, and WeasyPrint PDF export.
CUCM¶
- Supported versions: CUCM v14 & v15.
- 20 MCP tools across AXL, RisPort70, SSH OS Admin and Phone Web Access.
- Prompts:
cucm/procedure,cucm/security_audit. - Resources: 8 VOS CLI Guide chapters and 5 Security Guide (R15) chapters.
- Notable: IP Phone screenshot capture (
phone_screenshot); security audit prompt based on the Cisco Security Guide R15.
IMP¶
- Supported versions: IMP v14 & v15.
- 14 MCP tools across AXL and SSH OS Admin.
- Prompts:
imp/procedure,imp/security_audit. - Resources: 8 VOS CLI Guide chapters and 3 Security Guide (R15) chapters.
- Notable: same RBAC and credential model as CUCM.
Deployment & Supply chain¶
- Production-ready
Dockerfile(multi-stage) anddocker-compose.yml, hardened non-root runtime. - Base image and GitHub Actions pinned by digest; Dependabot refreshes them weekly.
- Dependency management migrated to
uvwith hasheduv.lock.
Documentation¶
SECURITY.mdregenerated and aligned with the documentation site.- Setup guides updated to highlight the
.env-only policy.
Testing & CI¶
- 839+ unit tests, 93%+ coverage (90% threshold enforced), live CUCM integration tests, Python 3.12 + 3.13 matrix.
- Bandit SAST, Gitleaks secret scan, Trivy image scan β all blocking.
- Mypy report (warn-only) and pip-audit on runtime + dev dependency trees.
- Signed CycloneDX SBOM produced and signed offline at release time.
Dependencies¶
- bcrypt==5.0.0
- colorlog==6.10.1
- cryptography==48.0.0
- fastmcp==3.2.4
- lxml==6.1.1
- Markdown==3.10.2
- matplotlib==3.10.9
- mcp==1.27.1
- numpy==2.4.6
- paramiko==5.0.0
- Pillow==12.2.0
- prometheus_client==0.25.0
- pydantic==2.13.4
- PyJWT==2.13.0
- python-dotenv==1.2.2
- requests==2.34.2
- starlette==1.2.0
- urllib3==2.7.0
- weasyprint==68.1
- zeep==4.3.2