Monta MCP Server
by nickknissen
README.md
# Monta MCP Server
An MCP (Model Context Protocol) server that wraps the [Monta Python SDK](https://github.com/nickknissen/monta-python/) to provide LLM-friendly access to the Monta EV charging API.
## Features
This MCP server exposes the following tools for interacting with Monta's EV charging platform:
### Architecture Highlights
- **Efficient session management**: Uses FastMCP's lifespan pattern to maintain a single persistent aiohttp session
- **Connection pooling**: Reuses HTTP connections across all tool invocations for optimal performance
- **Type-safe context**: All tools access shared resources through strongly-typed lifespan context
- **Proper cleanup**: Automatically closes sessions on server shutdown
- **Robust error handling**: State-changing operations include input validation, timeout protection (10s), and comprehensive error logging
### Charge Point Management
- `get_charge_points` - List all available charging stations with pagination
- `get_charge_point` - Get detailed information about a specific charging station
### Charging Operations
- `get_charges` - View charging history/sessions with filtering options
- `start_charge` - Start a charging session at a specific charge point
- `stop_charge` - Stop an active charging session
### Wallet & Payments
- `get_personal_wallet` - View wallet balance and payment information
- `get_wallet_transactions` - Get transaction history with filtering
## Prerequisites
- Python 3.11 or higher
- Monta API credentials (client ID and client secret)
- `uv` package manager (recommended) or `pip`
## Installation
### Using uv (recommended)
```bash
git clone <repository-url>
cd monta-mcp
uv sync
```
### Using pip
```bash
git clone <repository-url>
cd monta-mcp
pip install -e .
```
## Configuration
The server requires Monta API credentials set as environment variables:
```bash
export MONTA_CLIENT_ID="your_client_id"
export MONTA_CLIENT_SECRET="your_client_secret"
```
### Getting Monta public API Credentials
Visit [Monta Public API Portal](https://docs.public-api.monta.com/reference/home#getting-access) and follow the guide
## Usage
### Running the Server
The server can be run directly:
```bash
# Using the installed script (default log: ./monta-mcp.log)
monta-mcp
# With custom log file location
monta-mcp --log-file /path/to/custom.log
# With custom log level
monta-mcp --log-level DEBUG
# Or using Python module
python -m monta_mcp
```
**Command-line Options:**
- `--log-file PATH` - Path to log file (default: `./monta-mcp.log`)
- `--log-level LEVEL` - Logging level: DEBUG, INFO, WARNING, ERROR (default: INFO)
### Testing with MCP Inspector
You can test the server using the MCP Inspector tool:
```bash
npx @modelcontextprotocol/inspector monta-mcp
```
This will open a web interface where you can:
- View all available tools
- Test tool calls with different parameters
- See responses from the Monta API
### Integrating with Claude Desktop
Add this configuration to your Claude Desktop config file:
**MacOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
**Windows**: `%APPDATA%/Claude/claude_desktop_config.json`
```json
{
"mcpServers": {
"monta": {
"command": "monta-mcp",
"env": {
"MONTA_CLIENT_ID": "your_client_id",
"MONTA_CLIENT_SECRET": "your_client_secret"
}
}
}
}
```
Or if using uv:
```json
{
"mcpServers": {
"monta": {
"command": "uv",
"args": ["run", "monta-mcp"],
"env": {
"MONTA_CLIENT_ID": "your_client_id",
"MONTA_CLIENT_SECRET": "your_client_secret"
}
}
}
}
```
**With custom log location:**
```json
{
"mcpServers": {
"monta": {
"command": "uv",
"args": ["run", "monta-mcp", "--log-file", "/Users/you/logs/monta.log"],
"env": {
"MONTA_CLIENT_ID": "your_client_id",
"MONTA_CLIENT_SECRET": "your_client_secret"
}
}
}
}
```
After adding the configuration, restart Claude Desktop. The Monta tools will be available in your conversations.
## Example Usage in Claude
Once configured, you can ask Claude things like:
- "Show me all my charging points"
- "Get details for charge point 12345"
- "What's my recent charging history?"
- "Check my wallet balance"
- "Start charging at station 12345"
TDQS
A3.8/5.0
Scored across 7 tools
Disambiguation5/5
Every tool has a clearly distinct purpose: charge point listing vs detail, charging actions vs history, and wallet operations. No overlap or ambiguity.
Naming Consistency5/5
All tools follow a consistent verb_noun pattern with snake_case (e.g., get_charge_points, start_charge). No mixed conventions.
Tool Count5/5
7 tools is well-scoped for an EV charging server, covering station info, session management, and financials without excess.
Completeness4/5
Core workflows are covered: listing/detailing stations, starting/stopping charges, viewing history, and wallet. Minor gap: no tool to get current charging status directly, but filterable in history.
Maintenance
ActivityInactive
ResponsivenessNo issues