v0.1.2
Critical
- Fix server lifespan not connected —
app_lifespanwas assigned to a non-existent_lifespan_handlerattribute on FastMCP, making the entire server non-functional when run via CLI. Now passed via thelifespan=constructor kwarg. - Propagate upstream
isErrorflag — upstream tool errors were silently converted to success responses. Now raisesToolErrorsoisError=trueis preserved in the proxied response.
Fixes
- Fix
_surfaced_idsset pruning modifying a set during iteration (potentialRuntimeErroron CPython 3.12+) - Fix
_parse_resultsregex splitting on---inside content (YAML frontmatter, markdown HR) - Fix
_parse_scratch_listtruncating keys containing: - Record metrics for non-text-only responses (images, embedded resources)
- Pass original arguments (with
_context_query) to surfacing on cache hit - Snapshot config once per request to prevent intra-request inconsistency from hot-reload
- Guard against double
start()leaking connections - Normalize
\r\nand\rto\nin content cleaning - NFKC-normalize text before injection pattern matching (Unicode confusable bypass)
- Add CJK sentence-end punctuation (
。!?) for better East Asian truncation - Widen UUID-based IDs from 48 bits to 64 bits to reduce collision probability
- Add
ProxyCache.stats()thread-safety lock - Wrap
_fastmcp_compatprivate API access in try/except for MCP SDK resilience - Move
feedback_trackercreation insidemcp_adaptersuccess guard
Docs
- Add
stm_proxy_healthtool to docs (tool count 6 → 7) - Remove
selectivefrom auto-selection flowchart (never returned byauto_select_strategy)
Testing
- 800 automated tests (up from 767)
Full Changelog: v0.1.1...v0.1.2