cmcp is a command-line utility that helps you interact with MCP servers. It's basically curl for MCP servers.
pip install cmcpInteract with the STDIO server:
cmcp COMMAND METHODAdd required parameters:
cmcp COMMAND METHOD param1=value param2:='{"arg1": "value"}'Add required environment variables:
cmcp COMMAND METHOD ENV_VAR1:value ENV_VAR2:value param1=value param2:='{"arg1": "value"}'Interact with the HTTP (or SSE) server:
cmcp URL METHODAdd required parameters:
cmcp URL METHOD param1=value param2:='{"arg1": "value"}'Add required HTTP headers:
cmcp URL METHOD Header1:value Header2:value param1=value param2:='{"arg1": "value"}'Enable verbose mode to show JSON-RPC request and response:
cmcp -v COMMAND_or_URL METHODGiven the following MCP Server (see here):
# server.py
from mcp.server.fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP("Demo")
# Add a prompt
@mcp.prompt()
def review_code(code: str) -> str:
return f"Please review this code:\n\n{code}"
# Add a static config resource
@mcp.resource("config://app")
def get_config() -> str:
"""Static configuration data"""
return "App configuration here"
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + bList prompts:
cmcp 'mcp run server.py' prompts/listGet a prompt:
cmcp 'mcp run server.py' prompts/get name=review_code arguments:='{"code": "def greet(): pass"}'List resources:
cmcp 'mcp run server.py' resources/listRead a resource:
cmcp 'mcp run server.py' resources/read uri=config://appList resource templates:
cmcp 'mcp run server.py' resources/templates/listList tools:
cmcp 'mcp run server.py' tools/listCall a tool:
cmcp 'mcp run server.py' tools/call name=add arguments:='{"a": 1, "b": 2}'Run the above MCP server with HTTP transport:
mcp run server.py -t streamable-httpList prompts:
cmcp http://localhost:8000 prompts/list
# or `cmcp http://localhost:8000/mcp prompts/list`Get a prompt:
cmcp http://localhost:8000 prompts/get name=review_code arguments:='{"code": "def greet(): pass"}'List resources:
cmcp http://localhost:8000 resources/listRead a resource:
cmcp http://localhost:8000 resources/read uri=config://appList resource templates:
cmcp http://localhost:8000 resources/templates/listList tools:
cmcp http://localhost:8000 tools/listCall a tool:
cmcp http://localhost:8000 tools/call name=add arguments:='{"a": 1, "b": 2}'Run the above MCP server with SSE transport:
mcp run server.py -t sseList prompts:
cmcp http://localhost:8000/sse prompts/listGet a prompt:
cmcp http://localhost:8000/sse prompts/get name=review_code arguments:='{"code": "def greet(): pass"}'List resources:
cmcp http://localhost:8000/sse resources/listRead a resource:
cmcp http://localhost:8000/sse resources/read uri=config://appList resource templates:
cmcp http://localhost:8000/sse resources/templates/listList tools:
cmcp http://localhost:8000/sse tools/listCall a tool:
cmcp http://localhost:8000/sse tools/call name=add arguments:='{"a": 1, "b": 2}'For convenience, you can use a configuration file to manage your MCP servers instead of typing the full command or URL each time. By default, cmcp looks for .cmcp/mcp.json (in the current directory) or ~/.cmcp/mcp.json (in your home directory).
The configuration follows the standard MCP JSON format, which is also used by Cursor, Claude Code, FastMCP, and other MCP clients.
Example configuration file:
{
"mcpServers": {
"local-server": {
"command": "python",
"args": ["mcp-server.py"],
"env": {
"API_KEY": "value"
}
},
"remote-server": {
"url": "http://localhost:3000/mcp",
"headers": {
"API_KEY": "value"
}
}
}
}Use a configured server by prefixing its name with ::
# Use the local-server from config
cmcp :local-server tools/list
# Use the remote-server from config
cmcp :remote-server tools/call name=add arguments:='{"a": 1, "b": 2}'
# Use a custom config file
cmcp --config /path/to/config.json :local-server tools/listcA2A: A command-line utility for interacting with A2A agents.
