Highlights
- Subprocess kernel (Jupyter-style):
timeoutis enforced for real — runaway code gets KeyboardInterrupt with namespace state preserved; segfaults/OOM kill only the kernel child and it respawns instantly with an explicit "variables cleared" notice - Top-level
await— noasyncio.run()wrapper needed - Lazy MCP bridge —
.mcp.jsonservers connect on firstmcp.*use (9/10 sessions spawn zero child servers); failures visible inmcp.failed - ~350MB smaller install (tree-sitter removed); nest_asyncio deleted
Hardening (stress-test driven)
- Lone surrogates in output no longer wedge the server (UTF-8 sanitization at the model boundary)
- Exception message/traceback capped at 10KB/20KB
reset=Truerestores shadowedsh/mcphelperssh()is binary-safe (errors=replace)- Head+tail stdout truncation; better error display + hints
Breaking changes
Removed (zero observed usage across real agent transcripts): workspace/git/ast_utils/code utilities, %magics + obj? queries, inject param, mcp.tools.* dot-style + discover_tools(), SSE transport (stdio only).
Install
/plugin marketplace add iota-uz/repl-mcp
/plugin install python-repl@repl-mcp
or: claude mcp add python-repl -- uvx --from git+https://github.com/iota-uz/repl-mcp@v2.0.0 repl-mcp