v0.12.0 — progress narration on the stdlib logger, and CI checks that actually block
SEP-2577 deprecated the MCP logging capability on 2026-07-28 — the capability itself, with no in-protocol replacement. This server used it 119 times to narrate progress. That narration now goes to the stdlib logger.
The user-visible part, stated plainly. MCP clients no longer receive progress notifications. An agent driving a long-running tool sees no intermediate narration. This is forced rather than chosen: ctx.report_progress survives but carries a numeric fraction, not text, so there is nowhere for the narration to go. Every fact a caller needs is carried by the tool's return value — verified call site by call site, not assumed.
Breaking, released as a MINOR bump under the pre-1.0 rule (SemVer §4). No deprecation cycle is possible when upstream removes something with no replacement.
Changed
- All 119
ctx.info/ctx.warningcalls write to the module logger. The 75if ctx:guards that existed only to protect them are gone.ctxstays in every tool signature — the surface is unchanged at 34 tools and 3 prompts. - Logging is configured on the package logger at import, with
propagate = False. Thelogging.basicConfigcall this previously relied on was inert:MCPServer(...)claims the root logger while the module is still importing, andbasicConfigdoes nothing when root already has handlers. That had three consequences, all fixed — the intended format never applied, the destination belonged to whichever component configured root first (a host pointing root at stdout put tool narration on the stdio transport's JSON-RPC channel), and an embedder callingmcp.run()withoutmain()dropped all INFO narration entirely rather than relocating it. MCP_LOG_LEVELsets the package log level. Records are held to one physical line and bounded in length: a newline in a caller-suppliedsignal_idforges an entry in a line-oriented operator log, and an unbounded value is a synchronous write to a pipe the client is not obliged to drain.
Fixed — 29 tool docstrings had drifted into four different wordings for the same parameter, including seven pointing at a "module note" nobody had written. Docstrings are the tool descriptions MCP clients read, so these were user-facing.
Development — no runtime change, but the release ships the source: every CI check now blocks. The mypy and Black jobs both ran with continue-on-error: true and reported green whatever they found. mypy is blocking against a frozen baseline; Black is blocking outright. Tests now exercise the checkout they live in rather than whichever one ran pip install -e ..
Verification — 1024 passed across Python 3.11/3.12 on Windows, Linux and macOS. Wheel and sdist validated with twine check and smoke-tested from a clean virtualenv before tagging.
Full detail in CHANGELOG.md.
Install: pip install predictive-maintenance-mcp==0.12.0