MCP CLI - Model Context Protocol Command Line Interface

by chrishayuk

MCP Client 1,261 stars
  • agent-framework

About

What is MCP CLI - Model Context Protocol Command Line Interface?

MCP CLI is a command-line interface for interacting with Model Context Protocol (MCP) servers. Built on the CHUK-MCP pure Python protocol library, it provides multiple operational modes for LLM communication, tool usage, and conversation management.

How to use MCP CLI - Model Context Protocol Command Line Interface?

Install from source by cloning the repository and running pip install -e ".[cli,dev]". Configure servers in server_config.json and set API keys as environment variables (OPENAI_API_KEY, ANTHROPIC_API_KEY, or a local Ollama installation). Use global arguments like --server, --provider, --model, and --config-file. If you encounter a "Missing argument 'KWARGS'" error, use the equals sign format (e.g., --server=sqlite) or add a double-dash (--) before arguments.

Key features of MCP CLI - Model Context Protocol Command Line Interface

- Multiple operational modes: Chat, Interactive, Command, and Direct Commands
- Multi-provider support: OpenAI, Anthropic, and Ollama integrations
- Robust tool system with automatic discovery, execution, and history tracking
- Advanced conversation management with filtering, JSON export, and compaction
- Rich user experience with command completion, colored output, and progress indicators
- Resilient resource management with graceful error handling and cleanup

Use cases of MCP CLI - Model Context Protocol Command Line Interface

- Conversational LLM interaction with automatic tool usage in Chat mode
- Scriptable automation and pipeline integration using Command mode
- Direct server operations through Interactive mode's command-driven shell
- Batch processing of multiple files with GNU Parallel and Command mode

FAQ from MCP CLI - Model Context Protocol Command Line Interface

What are the prerequisites for installing MCP CLI?

Python 3.11 or higher is required, along with valid API keys for OpenAI (OPENAI_API_KEY) or Anthropic (ANTHROPIC_API_KEY), or a local Ollama installation. A server configuration file (server_config.json by default) is also needed.

Which LLM providers and models are supported?

OpenAI (e.g., gpt-4o-mini, gpt-4o, gpt-4-turbo), Ollama (e.g., llama3.2, qwen2.5-coder), and Anthropic (e.g., claude-3-opus, claude-3-sonnet) are supported. The architecture is extensible for additional providers.

How do I resolve the "Missing argument 'KWARGS'" error?

Use the equals sign format for all arguments (e.g., mcp-cli chat --server=sqlite --provider=ollama) or add a double-dash (--) before the arguments (e.g., mcp-cli chat -- --server sqlite). When using uv with multiple parameters, append an empty string at the end.

What is the difference between Chat mode and Interactive mode?

Chat mode provides a natural language conversational interface where the LLM can automatically use available tools. Interactive mode offers a command-driven shell interface for direct server operations (e.g., listing tools, calling resources, managing providers).

Can I use MCP CLI in scripts or pipelines?

Yes, Command mode (mcp-cli cmd) is designed for Unix-friendly automation. It supports input/output file paths, prompt templates, direct tool calls, and piping stdin/stdout, making it suitable for batch processing and integration into shell scripts.

Details

Author
chrishayuk
GitHub stars
1,261
Category
agent-framework
Repository
chrishayuk/mcp-cli

MCP CLI - Model Context Protocol Command Line Interface

A powerful, feature-rich command-line interface for interacting with Model Context Protocol servers. This client enables seamless communication with LLMs through integration with the CHUK-MCP protocol library which is a pyodide compatible pure python protocol implementation of MCP, supporting tool usage, conversation management, and multiple operational modes.

🔄 Protocol Implementation

The core protocol implementation has been moved to a separate package at:
https://github.com/chrishayuk/chuk-mcp

This CLI is built on top of the protocol library, focusing on providing a rich user experience while the protocol library handles the communication layer.

🌟 Features

- Multiple Operational Modes:
- Chat Mode: Conversational interface with direct LLM interaction and automated tool usage
- Interactive Mode: Command-driven interface for direct server operations
- Command Mode: Unix-friendly mode for scriptable automation and pipelines
- Direct Commands: Run individual commands without entering interactive mode

- Multi-Provider Support:
- OpenAI integration (gpt-4o-mini, gpt-4o, gpt-4-turbo, etc.)
- Ollama integration (llama3.2, qwen2.5-coder, etc.)
- Anthropic integration (claude-3-opus, claude-3-sonnet, etc.)
- Extensible architecture for additional providers

- Provider and Model Management:
- Configure multiple LLM providers (API keys, endpoints, default models)
- Switch between providers and models during sessions
- Command-line arguments for provider/model selection
- Interactive commands for provider configuration

- Robust Tool System:
- Automatic discovery of server-provided tools
- Server-aware tool execution
- Tool call history tracking and analysis
- Support for complex, multi-step tool chains

- Advanced Conversation Management:
- Complete conversation history tracking
- Filtering and viewing specific message ranges
- JSON export capabilities for debugging or analysis
- Conversation compaction for reduced token usage

- Rich User Experience:
- Command completion with context-aware suggestions
- Colorful, formatted console output
- Progress indicators for long-running operations
- Detailed help and documentation

- Resilient Resource Management:
- Proper cleanup of asyncio resources
- Graceful error handling
- Clean terminal restoration
- Support for multiple simultaneous server connections

📋 Prerequisites

- Python 3.11 or higher
- For OpenAI: Valid API key in OPENAI_API_KEY environment variable
- For Anthropic: Valid API key in ANTHROPIC_API_KEY environment variable
- For Ollama: Local Ollama installation
- Server configuration file (default: server_config.json)
- CHUK-MCP protocol library

🚀 Installation

Install from Source

1. Clone the repository:

git clone https://github.com/chrishayuk/mcp-cli
cd mcp-cli  

2. Install the package with development dependencies:

pip install -e ".[cli,dev]"

3. Run the CLI:

mcp-cli --help

Using UV (Alternative Installation)

If you prefer using UV for dependency management:

# Install UV if not already installed
pip install uv

Install dependencies

uv sync --reinstall

Run using UV

uv run mcp-cli --help

🧰 Global Command-line Arguments

Global options available for all modes and commands:

- --server: Specify the server(s) to connect to (comma-separated for multiple)
- --config-file: Path to server configuration file (default: server_config.json)
- --provider: LLM provider to use (openai, anthropic, ollama, default: openai)
- --model: Specific model to use (provider-dependent defaults)
- --disable-filesystem: Disable filesystem access (default: true)

CLI Argument Format Issue

You might encounter a "Missing argument 'KWARGS'" error when running various commands. This is due to how the CLI parser is configured. To resolve this, use one of these approaches:

1. Use the equals sign format for all arguments:

   mcp-cli tools call --server=sqlite
mcp-cli chat --server=sqlite --provider=ollama --model=llama3.2

2. Add a double-dash (--) after the command and before arguments:

   mcp-cli tools call -- --server sqlite
mcp-cli chat -- --server sqlite --provider ollama --model llama3.2

3. When using uv and multiple extra parameters, follow the 2nd step but add an empty string at the end:

   uv run mcp-cli chat -- --server sqlite --provider ollama --model llama3.2 ""

These format issues apply to all commands (chat, interactive, tools, etc.) and are due to how the argument parser interprets positional vs. named arguments.

🌐 Available Modes

1. Chat Mode

Chat mode provides a natural language interface for interacting with LLMs, where the model can automatically use available tools:

# Default (makes chat the default when no other command is specified)
uv run mcp-cli

Explicit chat mode

uv run mcp-cli chat --server sqlite

With specific provider and model

uv run mcp-cli chat --server sqlite --provider openai --model gpt-4o

2. Interactive Mode

Interactive mode provides a command-driven shell interface for direct server operations:

uv run mcp-cli interactive --server sqlite

3. Command Mode (Cmd)

Command mode provides a Unix-friendly interface for automation and pipeline integration:

uv run mcp-cli cmd --server sqlite [options]

4. Direct Commands

Run individual commands without entering an interactive mode:

# List available tools
uv run mcp-cli tools list {} --server sqlite

Call a specific tool

uv run mcp-cli tools call {} --server sqlite

🤖 Using Chat Mode

Chat mode provides a conversational interface with the LLM, automatically using available tools when needed.

Starting Chat Mode

# Default with {} for KWARGS
uv run mcp-cli --server sqlite

Explicit chat mode with {}

uv run mcp-cli chat --server sqlite

With specific provider and model

uv run mcp-cli chat --server sqlite --provider openai --model gpt-4o
# Note: Be careful with the command syntax

Correct format without any KWARGS parameter

uv run mcp-cli chat --server sqlite --provider ollama --model llama3.2

Or if you encounter the "Missing argument 'KWARGS'" error, try:

uv run mcp-cli chat --server=sqlite --provider=ollama --model=llama3.2

Chat Commands

In chat mode, use these slash commands:

General Commands

- /help: Show available commands - /help <command>: Show detailed help for a specific command - /quickhelp or /qh: Display a quick reference of common commands - exit or quit: Exit chat mode

Provider and Model Commands

- /provider or /p: Display or manage LLM providers - /provider: Show current provider and model - /provider list: List all configured providers - /provider config: Show detailed provider configuration - /provider set <name> <key> <value>: Set a provider configuration value - /provider <name>: Switch to a different provider - /model or /m: Display or change the current model - /model: Show current model - /model <name>: Switch to a different model

Tool Commands

- /tools: Display all available tools with their server information - /tools --all: Show detailed tool information including parameters - /tools --raw: Show raw tool definitions - /toolhistory or /th: Show history of tool calls in the current session - /th <N>: Show details for a specific tool call - /th -n 5: Show only the last 5 tool calls - /th --json: Show tool calls in JSON format

Conversation Commands

- /conversation or /ch: Show the conversation history - /ch <N>: Show a specific message from history - /ch -n 5: Show only the last 5 messages - /ch <N> --json: Show a specific message in JSON format - /ch --json: View the entire conversation history in raw JSON format - /save <filename>: Save conversation history to a JSON file - /compact: Condense conversation history into a summary

Display Commands

- /cls: Clear the screen while keeping conversation history - /clear: Clear both the screen and conversation history - /verbose or /v: Toggle between verbose and compact tool display modes

Control Commands

- /interrupt, /stop, or /cancel: Interrupt running tool execution - /servers: List connected servers and their status

🖥️ Using Interactive Mode

Interactive mode provides a command-driven shell interface for direct server interaction.

Starting Interactive Mode

# Using {} to satisfy KWARGS requirement
mcp-cli interactive {} --server sqlite

Interactive Commands

In interactive mode, use these commands:

- help: Show available commands
- exit or quit or q: Exit interactive mode
- clear or cls: Clear the terminal screen
- servers or srv: List connected servers with their status
- provider or p: Manage LLM providers
- provider: Show current provider and model
- provider list: List all configured providers
- provider config: Show detailed provider configuration
- provider set <name> <key> <value>: Set a provider configuration value
- provider <name>: Switch to a different provider
- model or m: Display or change the current model
- model: Show current model
- model <name>: Switch to a different model
- tools or t: List available tools or call one interactively
- tools --all: Show detailed tool information
- tools --raw: Show raw JSON definitions
- tools call: Launch the interactive tool-call UI
- resources or res: List available resources from all servers
- prompts or p: List available prompts from all servers
- ping: Ping connected servers (optionally filter by index/name)

📄 Using Command Mode (Cmd)

Command mode provides a Unix-friendly interface for automation and pipeline integration.

Starting Command Mode

# Using {} to satisfy KWARGS requirement
mcp-cli cmd {} --server sqlite [options]

Command Mode Options

- --input: Input file path (use - for stdin)
- --output: Output file path (use - for stdout, default)
- --prompt: Prompt template (use {{input}} as placeholder for input)
- --raw: Output raw text without formatting
- --tool: Directly call a specific tool
- --tool-args: JSON arguments for tool call
- --system-prompt: Custom system prompt
- --verbose: Enable verbose logging
- --provider: Specify LLM provider
- --model: Specify model to use

Command Mode Examples

Process content with LLM:

# Summarize a document (with {} for KWARGS)
uv run mcp-cli cmd --server sqlite --input document.md --prompt "Summarize this: {{input}}" --output summary.md

Process stdin and output to stdout

cat document.md | mcp-cli cmd {} --server sqlite --input - --prompt "Extract key points: {{input}}"

Use a specific provider and model

uv run mcp-cli cmd {} --server sqlite --input document.md --prompt "Summarize: {{input}}" --provider anthropic --model claude-3-opus

Call tools directly:

# List database tables
uv run mcp-cli cmd {} --server sqlite --tool list_tables --raw

Run a SQL query

uv run mcp-cli cmd {} --server sqlite --tool read_query --tool-args '{"query": "SELECT COUNT() FROM users"}'

Batch processing:

# Process multiple files with GNU Parallel
ls .md | parallel mcp-cli cmd --server sqlite --input {} --output {}.summary.md --prompt "Summarize: {{input}}"

🔧 Direct CLI Commands

Run individual commands without entering interactive mode:

Provider Commands

# Show current provider configuration
mcp-cli provider show

List all configured providers

mcp-cli provider list

Show detailed provider configuration

mcp-cli provider config

Set a configuration value

mcp-cli provider set <provider_name> <key> <value>

Example: mcp-cli provider set openai api_key "sk-..."

Tools Commands

# List all tools (using {} to satisfy KWARGS requirement)
uv run mcp-cli tools list {} --server sqlite

Show detailed tool information

uv run mcp-cli tools list {} --server sqlite --all

Show raw tool definitions

uv run mcp-cli tools list {} --server sqlite --raw

Call a specific tool interactively

uv run mcp-cli tools call {} --server sqlite

Resources and Prompts Commands

# List available resources
uv run mcp-cli resources list {} --server sqlite

List available prompts

uv run mcp-cli prompts list {} --server sqlite

Server Commands

# Ping all servers
uv run mcp-cli ping {} --server sqlite

Ping specific server(s)

uv run mcp-cli ping {} --server sqlite,another-server

📂 Server Configuration

Create a server_config.json file with your server configurations:

{
  "mcpServers": {
    "sqlite": {
      "command": "python",
      "args": ["-m", "mcp_server.sqlite_server"],
      "env": {
        "DATABASE_PATH": "your_database.db"
      }
    },
    "another-server": {
      "command": "python",
      "args": ["-m", "another_server_module"],
      "env": {}
    }
  }
}

🔐 Provider Configuration

Provider configurations are stored with these key settings:

- api_key: API key for authentication
- api_base: Base URL for API requests
- default_model: Default model to use with this provider
- Other provider-specific settings

Environment Variables

You can also set the default provider and model using environment variables:

export LLM_PROVIDER=openai
export LLM_MODEL=gpt-4o-mini

Configuration Example

The provider configuration is typically stored in a JSON file and looks like:

{
  "openai": {
    "api_key": "sk-...",
    "api_base": "https://api.openai.com/v1",
    "default_model": "gpt-4o-mini"
  },
  "anthropic": {
    "api_key": "sk-...",
    "api_base": "https://api.anthropic.com",
    "default_model": "claude-3-opus"
  },
  "ollama": {
    "api_base": "http://localhost:11434",
    "default_model": "llama3.2"
  }
}

📈 Advanced Usage Examples

Provider and Model Selection

You can change providers or models during a session:

# In chat mode
> /provider
Current provider: openai
Current model: gpt-4o-mini
To change provider: /provider <provider_name>

> /provider list
Available Providers
┏━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Provider ┃ Default Model ┃ API Base ┃
┡━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ openai │ gpt-4o-mini │ https://api.openai.com/v1 │
│ anthropic │ claude-3-opus │ https://api.anthropic.com │
│ ollama │ llama3.2 │ http://localhost:11434 │
└───────────┴────────────────┴─────────────────────────────────┘

> /provider anthropic
Switched to provider: anthropic with model: claude-3-opus
LLM client updated successfully

> /model claude-3-sonnet
Switched to model: claude-3-sonnet

Working with Tools in Chat Mode

In chat mode, simply ask questions that require tool usage, and the LLM will automatically call the appropriate tools:

You: What tables are available in the database?
[Tool Call: list_tables]
Assistant: There's one table in the database named products. How would you like to proceed?

You: Select top 10 products ordered by price in descending order
[Tool Call: read_query]
Assistant: Here are the top 10 products ordered by price in descending order:
1 Mini Drone - $299.99
2 Smart Watch - $199.99
3 Portable SSD - $179.99
...

Using Conversation Management

The MCP CLI provides powerful conversation history management:

> /conversation
Conversation History (12 messages)

| Role | Content

1 | system | You are an intelligent assistant capable of using t... 2 | user | What tables are available in the database? 3 | assistant | Let me check for you. ...

> /save conversation.json
Conversation saved to conversation.json

> /compact
Conversation history compacted with summary.

🛠️ Implementation Details

The provider configuration is managed by the ProviderConfig class, which:
- Loads/saves configuration from a local file
- Manages active provider and model settings
- Provides helper methods for retrieving configuration values

The LLM client is created using the get_llm_client function, which instantiates the appropriate client based on the provider and model settings.

📦 Dependencies

The CLI is organized with optional dependency groups:

- cli: Rich terminal UI, command completion, and provider integrations
- dev: Development tools and testing utilities
- wasm: (Reserved for future WebAssembly support)
- chuk-mcp: Protocol implementation library (core dependency)

Install with specific extras using:

pip install "mcp-cli[cli]"     # Basic CLI features
pip install "mcp-cli[cli,dev]" # CLI with development tools

🤝 Contributing

Contributions are welcome! Please follow these steps:

1. Fork the repository
2. Create a feature branch (git checkout -b feature/amazing-feature)
3. Commit your changes (git commit -m 'Add some amazing feature')
4. Push to the branch (git push origin feature/amazing-feature)
5. Open a Pull Request

📜 License

This project is licensed under the MIT License - see the LICENSE file for details.

🙏 Acknowledgments

- Rich for beautiful terminal formatting
- Typer for CLI argument parsing
- Prompt Toolkit for interactive input
- CHUK-MCP for the core protocol implementation