Command-line execution for MCP clients with command whitelists, path validation and working directory restrictions.
Setup
Choose your client, copy the config, then fill in any required environment variables.
claude mcp add cli --env ALLOWED_DIR='<ALLOWED_DIR>' --env ALLOWED_COMMANDS='<ALLOWED_COMMANDS>' --env ALLOWED_FLAGS='<ALLOWED_FLAGS>' --env COMMAND_TIMEOUT='<COMMAND_TIMEOUT>' --env MAX_COMMAND_LENGTH='<MAX_COMMAND_LENGTH>' --env ALLOW_SHELL_OPERATORS='<ALLOW_SHELL_OPERATORS>' -- uv run cli-mcp-server~/.codex/config.toml
[mcp_servers.cli]
command = "uv"
args = ["run", "cli-mcp-server"]
env = { ALLOWED_DIR = "<ALLOWED_DIR>", ALLOWED_COMMANDS = "<ALLOWED_COMMANDS>", ALLOWED_FLAGS = "<ALLOWED_FLAGS>", COMMAND_TIMEOUT = "<COMMAND_TIMEOUT>", MAX_COMMAND_LENGTH = "<MAX_COMMAND_LENGTH>", ALLOW_SHELL_OPERATORS = "<ALLOW_SHELL_OPERATORS>" }
# codex mcp add cli --env ALLOWED_DIR='<ALLOWED_DIR>' --env ALLOWED_COMMANDS='<ALLOWED_COMMANDS>' --env ALLOWED_FLAGS='<ALLOWED_FLAGS>' --env COMMAND_TIMEOUT='<COMMAND_TIMEOUT>' --env MAX_COMMAND_LENGTH='<MAX_COMMAND_LENGTH>' --env ALLOW_SHELL_OPERATORS='<ALLOW_SHELL_OPERATORS>' -- uv run cli-mcp-server~/.cursor/mcp.json
{
"mcpServers": {
"cli": {
"command": "uv",
"args": [
"run",
"cli-mcp-server"
],
"env": {
"ALLOWED_DIR": "<ALLOWED_DIR>",
"ALLOWED_COMMANDS": "<ALLOWED_COMMANDS>",
"ALLOWED_FLAGS": "<ALLOWED_FLAGS>",
"COMMAND_TIMEOUT": "<COMMAND_TIMEOUT>",
"MAX_COMMAND_LENGTH": "<MAX_COMMAND_LENGTH>",
"ALLOW_SHELL_OPERATORS": "<ALLOW_SHELL_OPERATORS>"
}
}
}
}.vscode/mcp.json
{
"servers": {
"cli": {
"type": "stdio",
"command": "uv",
"args": [
"run",
"cli-mcp-server"
],
"env": {
"ALLOWED_DIR": "<ALLOWED_DIR>",
"ALLOWED_COMMANDS": "<ALLOWED_COMMANDS>",
"ALLOWED_FLAGS": "<ALLOWED_FLAGS>",
"COMMAND_TIMEOUT": "<COMMAND_TIMEOUT>",
"MAX_COMMAND_LENGTH": "<MAX_COMMAND_LENGTH>",
"ALLOW_SHELL_OPERATORS": "<ALLOW_SHELL_OPERATORS>"
}
}
}
}~/.gemini/settings.json
{
"mcpServers": {
"cli": {
"command": "uv",
"args": [
"run",
"cli-mcp-server"
],
"env": {
"ALLOWED_DIR": "<ALLOWED_DIR>",
"ALLOWED_COMMANDS": "<ALLOWED_COMMANDS>",
"ALLOWED_FLAGS": "<ALLOWED_FLAGS>",
"COMMAND_TIMEOUT": "<COMMAND_TIMEOUT>",
"MAX_COMMAND_LENGTH": "<MAX_COMMAND_LENGTH>",
"ALLOW_SHELL_OPERATORS": "<ALLOW_SHELL_OPERATORS>"
}
}
}
}claude_desktop_config.json
{
"mcpServers": {
"cli": {
"command": "uv",
"args": [
"run",
"cli-mcp-server"
],
"env": {
"ALLOWED_DIR": "<ALLOWED_DIR>",
"ALLOWED_COMMANDS": "<ALLOWED_COMMANDS>",
"ALLOWED_FLAGS": "<ALLOWED_FLAGS>",
"COMMAND_TIMEOUT": "<COMMAND_TIMEOUT>",
"MAX_COMMAND_LENGTH": "<MAX_COMMAND_LENGTH>",
"ALLOW_SHELL_OPERATORS": "<ALLOW_SHELL_OPERATORS>"
}
}
}
}.trae/mcp.json
{
"mcpServers": {
"cli": {
"command": "uv",
"args": [
"run",
"cli-mcp-server"
],
"env": {
"ALLOWED_DIR": "<ALLOWED_DIR>",
"ALLOWED_COMMANDS": "<ALLOWED_COMMANDS>",
"ALLOWED_FLAGS": "<ALLOWED_FLAGS>",
"COMMAND_TIMEOUT": "<COMMAND_TIMEOUT>",
"MAX_COMMAND_LENGTH": "<MAX_COMMAND_LENGTH>",
"ALLOW_SHELL_OPERATORS": "<ALLOW_SHELL_OPERATORS>"
}
}
}
}Environment variables
ALLOWED_DIRALLOWED_COMMANDSALLOWED_FLAGSCOMMAND_TIMEOUTMAX_COMMAND_LENGTHALLOW_SHELL_OPERATORS
Replace the placeholders with your own credentials and keep them out of version control.