Skip to content

v0.12.0 — progress narration on the stdlib logger, and CI checks that actually block

Choose a tag to compare

@LGDiMaggio LGDiMaggio released this 09 Aug 16:14
· 51 commits to main since this release
5cd790a

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.warning calls write to the module logger. The 75 if ctx: guards that existed only to protect them are gone. ctx stays 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. The logging.basicConfig call this previously relied on was inert: MCPServer(...) claims the root logger while the module is still importing, and basicConfig does 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 calling mcp.run() without main() dropped all INFO narration entirely rather than relocating it.
  • MCP_LOG_LEVEL sets the package log level. Records are held to one physical line and bounded in length: a newline in a caller-supplied signal_id forges 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