Every tool here is one you wrote, and the constraints are checked before the shell sees anything — which is why the author's own advice is to keep the scope read-only rather than adding a tool that deletes files.
A Go binary that reads a YAML file of tool definitions and serves them over MCP. Each tool is a command template with typed parameters and a set of CEL expressions that must hold before the command is allowed to execute.
- Tools defined in YAML: a name, a description, typed parameters with defaults and required flags, and the command template they expand into
- CEL constraints evaluated before execution — `directory.startsWith('/')`, `!directory.contains('..')`, `max_depth >= 1 && max_depth <= 3` — so a call that fails them never reaches the shell
- Output prefixes, so the model receives framed results instead of bare stdout
- Sandboxed runners for commands you would rather not run directly on the host
- Tools resolved by name out of the tools directory, so a config can be referenced as `example` rather than a full path
- Worked examples in the repository, including read-only `kubectl` and AWS CLI configurations
The `go` command available to whatever launches the server — clients run it as `go run github.com/inercia/MCPShell@v0.1.8 mcp --tools /my/example.yaml`. Point `--logfile` somewhere writable. Any MCP client works: Cursor, VS Code, Witsy. MIT.
Build from source — clone the repository and build it, then point your client at the binary
