Inspect, call, and script any MCP server — over stdio or HTTP, with OAuth, from one CLI.
The curl-equivalent for the Model Context Protocol.
Quickstart • Install • Examples • Docs
Your editors (Claude Desktop, Cursor, Zed, opencode) configure dozens of MCP servers — GitHub, Linear, Notion, a filesystem sandbox. Once configured, the only way to drive them is from inside that chat app. mcpal is the shell tool that was missing: point it at any server and call tools, read resources, get prompts, run raw JSON-RPC, or stream notifications.
- Debug servers you're building.
tool call,tool describe,raw,watchagainst the server you just started — no chat-UI round-trip. - Script integrations in CI. A nightly job that pulls Linear tickets or files a GitHub issue, through the same servers your editors use.
- Call already-configured servers. Cursor set up
linear? Runmcpal tool list cursor:linear. No copy-pastingmcp.json. - Skip the upfront tool-definition tax. A chat app loads every server's full tool catalogue into the model's context. mcpal invokes one tool per shell line — pay for what you call. More in Why a CLI for MCP.
# any stdio MCP server, ephemeral
mcpal tool call "cmd:npx -y @modelcontextprotocol/server-everything" \
echo --message hi
# anonymous HTTP server
mcpal --auth none tool list https://mcp.context7.com/mcp
# HTTP + env-backed bearer (no token in shell history)
GH_TOKEN=ghp_… mcpal --auth env:GH_TOKEN \
tool list https://api.githubcopilot.com/mcp/Full table of one-line <ref> shapes: One-line MCP.
mcpal server discover # what's installed where
mcpal tool list cursor:linear --names-only
mcpal tool call cursor:linear get-issue --id ENG-123# stdio
mcpal server add ev -- npx -y @modelcontextprotocol/server-everything
mcpal tool call ev echo --message hi
# HTTP + bearer (literal token → OS keyring)
mcpal server add gh --http https://api.githubcopilot.com/mcp/ --bearer $GH_TOKEN
# HTTP + OAuth 2.1 (PKCE + DCR) — browser opens inline
mcpal server add notion --http https://mcp.notion.com/v1 --oauth
mcpal tool list notionmcpal tui # split-pane MCP browser# Repo has mcpal.yml at root
mcpal run get-issue --profile prodTapes that produce these GIFs live in
demo/.
| Platform | One-liner |
|---|---|
| macOS / Linux | brew install pawelb0/tap/mcpal |
| Debian / Ubuntu | curl -fsSLO …/releases/latest/download/mcpal_amd64.deb && sudo dpkg -i mcpal_amd64.deb |
| Any (Rust) | cargo install --git https://github.com/pawelb0/mcpal --path crates/mcpal |
| Windows | cargo install --git https://github.com/pawelb0/mcpal --path crates/mcpal |
Full guide — .deb URL, curl | sh installer, shell completions, verify — in the Install chapter.
mcpal <command> [<ref>] [options]
A <ref> is one of:
- a name registered with
mcpal server add <source>:<name>frommcpal server discover(e.g.cursor:linear)- a bare
<name>if unambiguous across discovered sources - an
https://URL - a path to a JSON
ServerSpec
mcpal discover reads the MCP server lists that other clients
(Claude Desktop, Cursor, opencode, ...) already wrote to disk; those
servers are addressable directly.
Inspect a server:
mcpal server ping ev
mcpal server capabilities ev
mcpal tool describe ev echo
Call a tool (flags, JSON, or stdin):
mcpal tool call ev echo --message hi
mcpal tool call ev echo --params '{"message":"hi"}'
echo '{"message":"hi"}' | mcpal tool call ev echo --params -
HTTP with a bearer token:
mcpal server add github --http https://api.githubcopilot.com/mcp/ --bearer ghp_xxx
mcpal tool list github
Resources, prompts, notifications:
mcpal resource read ev demo://resource/static/document/architecture.md
mcpal prompt get ev args-prompt --city Dallas --state Texas
mcpal watch ev # one YAML doc per event
Pipelines and diagnostics:
mcpal --output json tool list ev | jq -r '.[].name'
mcpal --query '[].name' tool list ev
mcpal debug doctor
Full command reference, recipes, and the protocol compliance matrix live in the manual.
~/.config/mcpal/config.toml on Linux,
~/Library/Application Support/mcpal/config.toml on macOS,
%APPDATA%\mcpal\config.toml on Windows. Override with
MCPAL_CONFIG=/path/to/file.
[server.everything]
transport = "stdio"
command = "npx"
args = ["-y", "@modelcontextprotocol/server-everything"]
[server.notion]
transport = "http"
url = "https://mcp.notion.com/v1"
auth = { type = "bearer_env", env = "NOTION_MCP_TOKEN" }Secrets do not live in this file. mcpal auth login writes them to
the OS keyring.
MIT


