CLI that turns MCP servers into terminal commands, single binary
mcp
CLI that turns MCP servers into terminal commands.
mcp sentry search_issues '{"query": "is:unresolved level:error"}'
No SDKs. No wrapper code. One binary, any MCP server.
What it does
MCP (Model Context Protocol) servers expose tools — search issues, query logs, send messages, read files. This CLI lets you call those tools directly from your terminal. You configure a server once, then use it like any other command.
$ mcp slack list_channels
$ mcp grafana search_dashboards '{"query": "api-latency"}'
$ mcp sentry get_issue_details '{"issue_id": "12345"}'
Output is always JSON. Pipe it, jq it, script it.
Quick start
Install:
# Homebrew (macOS and Linux)
brew install avelino/mcp/mcp
# Pre-built binary from GitHub Releases
# Download the latest from https://github.com/avelino/mcp/releases
# From source (requires Rust)
cargo install --path .
Add a server from the registry:
mcp add filesystem
Or add an HTTP server manually:
mcp add --url https://mcp.sentry.dev/sse sentry
See what tools are available:
mcp sentry --list
Call a tool:
mcp sentry search_issues '{"query": "is:unresolved"}'
That's it. You're using MCP.
How it works
You --> mcp CLI --> MCP Server --> Service API
|
servers.json
The CLI reads your config (~/.config/mcp/servers.json), connects to the server using stdio or HTTP, and speaks JSON-RPC 2.0 to call tools. Authentication (OAuth 2.0, API tokens) is handled automatically.
Configuration
Servers live in ~/.config/mcp/servers.json:
{
"mcpServers": {
"slack": {
"command": "npx",
"args": ["-y", "slack-mcp-server@latest", "--transport", "stdio"],
"env": {
"SLACK_MCP_XOXP_TOKEN": "${SLACK_TOKEN}",
"SLACK_MCP_TEAM_ID": "${SLACK_TEAM_ID}"
}
},
"sentry": {
"url": "https://mcp.sentry.dev/sse"
}
}
}
Two types of servers:
- Stdio — the CLI spawns a local process (
command+args) - HTTP — the CLI connects to a remote URL (
url+ optionalheaders)
Environment variables use ${VAR_NAME} syntax and are resolved at runtime.
Authentication
For HTTP servers that require auth, mcp handles it automatically:
- OAuth 2.0 — If the server supports it,
mcpopens your browser, completes the flow, and saves the token - Manual token — If OAuth isn't available, it guides you to get a token with service-specific instructions
- Config headers — You can set
Authorizationheaders directly in config
Tokens are saved in ~/.config/mcp/auth.json and refreshed automatically.
Commands
| Command | Description |
|---|---|
| mcp --list | List configured servers |
| mcp <server> --list | List available tools |
| mcp <server> --info | List tools with input schemas |
| mcp <server> <tool> [json] | Call a tool |
| mcp search <query> | Search the MCP server registry |
| mcp add <name> | Add a server from registry |
| mcp add --url <url> <name> | Add an HTTP server |
| mcp remove <name> | Remove a server |
Piping JSON from stdin
If you don't pass JSON arguments on the command line, mcp reads from stdin:
echo '{"query": "is:unresolved"}' | mcp sentry search_issues
Environment variables
| Variable | Description |
|---|---|
| MCP_CONFIG_PATH | Override config file location |
| MCP_TIMEOUT | Timeout in seconds for stdio servers (default: 60) |
Documentation
Full documentation: docs/
Development
cargo build
cargo test
Contributing
- Fork the repo
- Create your branch (
git checkout -b my-feature) - Make your changes
- Run tests (
cargo test) - Submit a pull request
License
MIT