mcp-cli
MCP 服务配置
复制以下 JSON 到 OPClaw 或其他 MCP 客户端的配置文件中即可使用
{
"mcpServers": {
"git": {
"args": [
"./dist/index.js",
"git",
"./config.example.json"
],
"command": "node"
}
}
}
服务介绍
MCP CLI Wrapper
A flexible MCP (Model Context Protocol) server that wraps any CLI tool and exposes its subcommands as individual MCP tools with typed parameters.
Features
- Config-driven tools: Define CLI subcommands as MCP tools via JSON configuration
- Fallback mode: Single
run_clitool when no config provided - Type-safe parameters: Zod validation for all inputs before execution
- Flexible parameter types: Supports positional args, flags, and boolean switches
- Preserved parameter order: Flags and positionals stay interleaved as defined
- Nested subcommands: Supports
git remote addstyle commands - Safe execution: Uses
spawnSyncto prevent command injection - Full output capture: Returns stdout, stderr, and exit code
Installation
npm install
npm run build
Usage
Basic (Fallback Mode)
Run without a config file to get a single run_cli tool that accepts raw arguments:
node dist/index.js git
This exposes one tool:
run_cli- Acceptsargs: string[]and executesgit <args...>
With Configuration
Run with a config file to expose multiple typed tools:
node dist/index.js git ./config.example.json
This exposes tools like:
git_status- Show working tree statusgit_commit- Commit with typedmessageand optionalallflaggit_add- Stage files withpathspecparametergit_log- Show logs withonelineandmax_countoptions- And more...
Configuration Format
Create a JSON file with tool definitions:
{
"tools": [
{
"name": "git_commit",
"description": "Record changes to the repository with a commit message.",
"subcommand": "commit",
"parameters": [
{
"name": "message",
"type": "string",
"description": "The commit message.",
"flag": "-m",
"required": true
},
{
"name": "all",
"type": "boolean",
"description": "Automatically stage all modified files.",
"flag": "--all",
"required": false
}
]
}
]
}
Parameter Configuration
Each parameter supports:
| Field | Type | Description |
|---|---|---|
name |
string | Parameter name (used in schema) |
type |
"string" | "number" | "boolean" |
Parameter type |
description |
string | Description shown to AI agents |
flag |
string (optional) | CLI flag (e.g., -m, --force). If omitted, parameter is positional |
required |
boolean | Whether the parameter is required |
Parameter Order
Parameters are processed in declaration order. This allows you to define tools where flags must precede positional arguments:
{
"name": "docker_run",
"subcommand": "run",
"parameters": [
{ "name": "interactive", "flag": "-it", "type": "boolean", "required": false },
{ "name": "image", "type": "string", "required": true },
{ "name": "command", "type": "string", "required": false }
]
}
This produces: docker run -it ubuntu bash (flags before positionals)
Nested Subcommands
Use spaces in subcommand for nested commands:
{
"name": "git_remote_add",
"subcommand": "remote add",
"parameters": [
{ "name": "name", "type": "string", "required": true },
{ "name": "url", "type": "string", "required": true }
]
}
MCP Client Configuration
Claude Desktop
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"git": {
"command": "node",
"args": ["/path/to/mcp-cli-wrapper/dist/index.js", "git", "/path/to/config.json"]
}
}
}
Claude Code
Add to your MCP settings:
{
"mcpServers": {
"git": {
"command": "node",
"args": ["./dist/index.js", "git", "./config.example.json"]
}
}
}
Example Configs
Git (included)
See config.example.json for a complete Git configuration with 8 tools.
Docker (example)
{
"tools": [
{
"name": "docker_ps",
"description": "List running containers",
"subcommand": "ps",
"parameters": [
{ "name": "all", "type": "boolean", "flag": "-a", "description": "Show all containers", "required": false }
]
},
{
"name": "docker_run",
"description": "Run a container",
"subcommand": "run",
"parameters": [
{ "name": "detach", "type": "boolean", "flag": "-d", "description": "Run in background", "required": false },
{ "name": "name", "type": "string", "flag": "--name", "description": "Container name", "required": false },
{ "name": "image", "type": "string", "description": "Image to run", "required": true }
]
}
]
}
Security
- No shell interpolation: Arguments are passed directly via
spawnSync, preventing command injection - Input validation: All parameters validated with Zod schemas before execution
- Local execution only: Commands run on the local machine with the user's permissions
Development
# Install dependencies
npm install
# Build
npm run build
# Run in development
npm run dev git ./config.example.json
License
MIT