call_cliLABSCO SUMMARY
Fewer tools on purpose — the context problem is the design brief.
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.
What it is
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.
What you get
- 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 the README describes but does not name: 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
Requirements
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.
Setup effort
Build from source — git clone https://github.com/GetSherlog/Sherlog-MCP.git
USE CASES
Digging into a result too large to read
It lands in a variable; the model writes code to pull out the part that matters.
Composing command-line tools
Chained CLI calls keep only the required output in context.
Combining data from several MCP servers
Attached servers land in the same shell namespace as DataFrames.
Continuing yesterday's investigation
Shell state persists across container restarts.
2 tools
Listed in project docs. Your client may show a different list.
execute_python_codeBEFORE YOU INSTALL
What to know first
Tools you get
2 tools named in the project's documentation.
Requires
- Docker Desktop
- npx on PATH (Claude Desktop connects through mcp-remote)
INSTALLATION
Connect your client
Server setup
git clone https://github.com/GetSherlog/Sherlog-MCP.git
cd Sherlog-MCP
docker build -t sherlog-mcp .
docker run -p 8000:8000 sherlog-mcpThe server is then available at http://localhost:8000/mcp. Clients that support streamable HTTP can connect to that URL directly; Claude Desktop connects through mcp-remote.
MCP Clients
Claude Desktop
{
"mcpServers": {
"sherlog": {
"command": "npx",
"args": [
"mcp-remote",
"http://<YOUR_SERVER_IP>:8000/mcp"
]
}
}
}<YOUR_SERVER_IP> is localhost if the container runs on this machine, or your server's IP address or domain if it runs remotely.
GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET are only needed for the optional Google Workspace access. The repository's .env.example says to copy it to .env and set them there, and its docker-compose.yml passes them into the container; the plain docker run command does not.