LABSCO 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
examplerather than a full path - Worked examples in the repository, including read-only
kubectland 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
One command — go run github.com/inercia/MCPShell@v0.1.8 mcp --tools /my/example.yaml --logfile /some/path/mcpshell/example.log
USE CASES
Asking why the disk is full
The author's own example: a disk_usage tool wrapping du, with the directory forced to an absolute path and the recursion depth capped between 1 and 3.
Giving the model a read-only view of a Kubernetes cluster
Define the kubectl calls you are willing to allow as tools; nothing outside that file is reachable.
Prototyping a tool in minutes
Add a block of shell to the YAML, refresh the client, and it is callable — no server code to write or build.
Keeping a risky command off the host
Run it through a sandboxed runner or a container instead of directly, configured per tool.
Blocking argument injection before it happens
A regex constraint on the parameter rejects anything outside the safe character set, and the command is never expanded.
BEFORE YOU INSTALL
What to know first
Requires
go on PATH
INSTALLATION
Connect your client
Server setup
go run github.com/inercia/MCPShell@v0.1.8 mcp --tools /my/example.yaml --logfile /some/path/mcpshell/example.logMCP Clients
Cursor — go run
{
"mcpServers": {
"mcpshell": {
"command": "go",
"args": [
"run",
"github.com/inercia/MCPShell@v0.1.8",
"mcp",
"--tools",
"<YOUR_PATH_TO_MCP_CLI>"
]
}
}
}Cursor — binary
Get the mcpshell binary: download it for your platform from https://github.com/inercia/MCPShell/releases, or build it from source:
git clone https://github.com/inercia/MCPShell.git
cd MCPShell
make buildThen add this to your configuration:
{
"mcpServers": {
"mcpshell": {
"command": "<YOUR_PATH_TO_MCPSHELL>",
"args": [
"mcp",
"--tools",
"<YOUR_PATH_TO_MCP_CLI>"
]
}
}
}<YOUR_PATH_TO_MCPSHELL> is the full path to that binary (after make build it is build/mcpshell inside your clone), and <YOUR_PATH_TO_MCP_CLI> is the full path to your tools file.
VS Code
Get the mcpshell binary: download it for your platform from https://github.com/inercia/MCPShell/releases, or build it from source:
git clone https://github.com/inercia/MCPShell.git
cd MCPShell
make buildThen add this to your configuration:
{
"servers": {
"mcpshell": {
"type": "stdio",
"command": "<YOUR_PATH_TO_MCPSHELL>",
"args": [
"mcp",
"--tools",
"<YOUR_PATH_TO_MCP_CLI>"
]
}
}
}<YOUR_PATH_TO_MCPSHELL> is the full path to that binary (after make build it is build/mcpshell inside your clone), and <YOUR_PATH_TO_MCP_CLI> is the full path to your tools file.
Claude Desktop
First start MCPShell in HTTP mode on port 3333 and leave it running: go run github.com/inercia/MCPShell@v0.1.8 mcp --tools <YOUR_PATH_TO_MCP_CLI> --http --port 3333
{
"mcpServers": {
"mcpshell-http": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"http://localhost:3333/sse"
]
}
}
}Codex
This route needs mcp-proxy installed first (the project notes it can often be installed with npm). Then start MCPShell in HTTP mode on port 3333 and leave it running: go run github.com/inercia/MCPShell@v0.1.8 mcp --tools <YOUR_PATH_TO_MCP_CLI> --http --port 3333
[mcp_servers.sse_local]
command = "mcp-proxy"
args = ["--transport", "streamablehttp", "http://localhost:3333/sse"]