Labsco
MCP SERVER

MCPShell

by inercia

Turn shell commands into MCP tools by writing YAML — with the guard conditions checked before anything runs.

Editors, Terminals & Local Dev Environment
Summary
You decide what the model is allowed to type.

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.

What it is

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.

What you get
  • 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
Requirements

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.

Setup effort

Build from source — clone the repository and build it, then point your client at the binary