| Crates.io | mcp-valve |
| lib.rs | mcp-valve |
| version | 2.0.0 |
| created_at | 2025-12-01 09:05:18.562752+00 |
| updated_at | 2025-12-11 03:48:07.448253+00 |
| description | Unified MCP CLI - Generic MCP Protocol Client |
| homepage | |
| repository | https://github.com/yonaka15/mcp-valve |
| max_upload_size | |
| id | 1959549 |
| size | 72,647 |
A unified MCP (Model Context Protocol) client that works with any MCP server through configurable profiles.
This tool is a thin wrapper around the MCP protocol.
inputSchema from tools/listtools/list shows a field named X, use X exactly as-is in your JSONcargo install mcp-valve
# Or build from source:
cargo build --release
# List configured servers
mcp-valve list-servers
# Start daemon (REQUIRED before any tool operations)
cd /path/to/your/project
mcp-valve --server playwright start-daemon
# List tools from a server
mcp-valve --server playwright list-tools
# Call a tool
mcp-valve --server playwright call browser_navigate --args '{"url":"https://example.com"}'
# Read args from stdin
echo '{"url":"https://example.com"}' | mcp-valve --server playwright call browser_navigate --args -
# Check daemon status
mcp-valve --server playwright daemon-status
# Stop daemon when done
mcp-valve --server playwright stop-daemon
Config file is searched in the following order:
--config <path> CLI flagMCP_VALVE_CONFIG environment variable$XDG_CONFIG_HOME/mcp-valve/servers.json~/.config/mcp-valve/servers.json~/.claude/scripts/mcp-servers.json (legacy)Example config:
{
"playwright": {
"command": ["npx", "@playwright/mcp@latest"],
"default_args": ["--headless"],
"supports_daemon": true,
"description": "Playwright browser automation",
"env": {}
},
"zen": {
"command": ["/path/to/python"],
"default_args": ["/path/to/server.py"],
"supports_daemon": true,
"description": "Zen MCP multi-AI model integration",
"env": {}
}
}
| Field | Type | Description |
|---|---|---|
command |
string[] |
Command and initial args to start the server |
default_args |
string[] |
Default arguments (overridden by --server-args) |
supports_daemon |
bool |
Enable daemon mode (required for tool operations) |
description |
string |
Human-readable description |
env |
object |
Environment variables to set |
Arguments support template expansion:
| Variable | Expands To |
|---|---|
{profile_dir} |
.mcp-profile/<server-name> |
{pid} |
Current process ID |
{cwd} |
Current working directory |
| Command | Description |
|---|---|
list-servers |
Show all configured servers |
start-daemon |
Start persistent daemon (required first) |
list-tools |
List available tools from server |
call <tool> |
Call a tool with JSON arguments |
shell |
Interactive REPL mode |
daemon-status |
Check daemon status |
stop-daemon |
Stop running daemon |
Daemon mode is required for all tool operations (call, list-tools, shell). This ensures:
# Start daemon in your project directory
cd /path/to/your/project
mcp-valve --server playwright start-daemon
# Output:
# Project: /path/to/your/project
# Profile: .mcp-profile/playwright
# Starting MCP daemon for 'playwright'...
# Daemon started (PID: 12345)
# Socket: /tmp/.mcp/playwright-12345.sock
# All operations now work
mcp-valve --server playwright list-tools
mcp-valve --server playwright call browser_navigate --args '{"url":"https://example.com"}'
# Check status
mcp-valve --server playwright daemon-status
# Output:
# Project: /path/to/your/project
# Server: playwright
# Profile: .mcp-profile/playwright
# Daemon is running
# PID: 12345
# Socket: /tmp/.mcp/playwright-12345.sock
# Stop daemon
mcp-valve --server playwright stop-daemon
Directory matters: Daemon state is stored in .mcp-profile/ in the current working directory. Different directories = separate daemon instances.
If you try to call a tool without starting the daemon:
Error: Daemon is not running for project '/path/to/project'
Start daemon with:
cd /path/to/project
mcp-valve --server playwright start-daemon
clap - CLI parsingserde / serde_json - JSON serializationanyhow - Error handlingnix - Unix system calls (umask, setsid, signals)MIT