The README argues that models degrade when given many tools and that dumping large payloads into context makes it worse. The response is the way engineers already work with big data: put the result in a variable and slice it. That is also why external MCP servers mount into the same namespace as DataFrames rather than returning raw text into the transcript.
A stateful MCP server with a deliberately narrow tool surface. Two tools do the work — a CLI runner and a Python evaluator — and everything they return persists in the session's shell namespace.
- call_cli runs a command-line tool inside the session; execute_python_code runs Python in the same namespace
- Tool results persist as shell variables, so a huge payload is queried rather than read
- One isolated workspace per session, with state that survives container restarts
- External MCP servers can be attached with EXTERNAL_MCPS_JSON; their tools appear as external_[server]_[tool] and their results convert to DataFrames in the same namespace
- Supporting tools cover installing packages and CLIs, inspecting variables, and tree-sitter code retrieval
- Two container variants: a vanilla one with the GitHub CLI and the Python scientific stack, and an Android one with the SDK, JDK, ADB, Fastboot and the BrowserStack CLI
Docker Desktop. Behaviour is tuned by environment variables: MCP_MAX_SESSIONS defaults to 4, MCP_AUTO_RESET_THRESHOLD to 200 operations before automatic cleanup, and MCP_MAX_OUTPUT_SIZE to 50000 bytes per buffer. Google Workspace access is optional and needs GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET. HTTP transport supports remote clients.
One command plus a key — npx -y @modelcontextprotocol/server-filesystem /tmp, then supply credentials
