A Model Context Protocol server that exposes your TeslaMate PostgreSQL database to MCP-aware AI clients (Claude Desktop, Cursor, etc.) over either stdio or streamable HTTP.
- 20 tools — 18 predefined analytics queries (battery, charging, driving, efficiency, locations) plus
run_sqlandget_database_schema - 6 prompts — one-click workflows for battery health, driving summary, charging behaviour, anomaly hunting, weather efficiency, and a quick status report
- 2 resources —
teslamate://queriesandteslamate://queries/{name}for catalog browsing without invoking a tool - Hardened
run_sql— runs inside a PostgreSQLREAD ONLYtransaction withstatement_timeout,lock_timeout, and an automatic row cap - Live schema introspection —
get_database_schemareadsinformation_schemaat runtime; no stale JSON checked into the repo - Two transports, one binary —
teslamate-mcp stdiofor local clients,teslamate-mcp httpfor remote - Bearer-token auth with timing-safe comparison;
/healthprobe for liveness checks Decimal → floatJSON serialization so language models see numbers, not strings
- TeslaMate already running against PostgreSQL
- Python 3.11+ for a local install, or Docker for a remote deployment
git clone https://github.com/cobanov/teslamate-mcp.git
cd teslamate-mcp
cp env.example .env
# Edit .env — at minimum, set DATABASE_URL
uv syncThe teslamate-mcp console script has four subcommands:
teslamate-mcp stdio # local (Cursor / Claude Desktop)
teslamate-mcp http [--host] [--port] # remote (HTTP / SSE)
teslamate-mcp gen-token # produce an AUTH_TOKEN value
teslamate-mcp list-tools # diagnostic: list registered toolspython -m teslamate_mcp <subcommand> works too.
Configure your MCP client to launch the stdio server. Example for Cursor or Claude Desktop:
{
"mcpServers": {
"teslamate": {
"command": "uv",
"args": ["--directory", "/path/to/teslamate-mcp", "run", "teslamate-mcp", "stdio"]
}
}
}cp env.example .env
# Set DATABASE_URL and ideally AUTH_TOKEN
docker compose up -dThe MCP endpoint is at http://localhost:8888/mcp and a liveness probe is exposed at http://localhost:8888/health.
A prebuilt multi-arch image (linux/amd64, linux/arm64) is also published to GHCR on every tagged release:
docker run --rm -e DATABASE_URL=... -p 8888:8888 ghcr.io/cobanov/teslamate-mcp:latestAll settings are read from environment variables (.env supported). Only DATABASE_URL is required.
| Variable | Default | Notes |
|---|---|---|
DATABASE_URL |
required | postgresql://user:pass@host:5432/teslamate |
AUTH_TOKEN |
empty | Enables bearer auth on the HTTP endpoint |
HOST |
0.0.0.0 |
HTTP bind host |
PORT |
8888 |
HTTP bind port |
POOL_MIN_SIZE |
1 |
psycopg pool floor |
POOL_MAX_SIZE |
10 |
psycopg pool ceiling |
QUERY_TIMEOUT_MS |
5000 |
statement_timeout for run_sql |
CUSTOM_SQL_ROW_LIMIT |
1000 |
LIMIT injected when run_sql doesn't supply one |
LOG_LEVEL |
INFO |
Standard Python log level |
DEBUG |
false |
Starlette debug mode (keep off in production) |
Generate a bearer token:
uv run teslamate-mcp gen-tokenVehicle: get_basic_car_information, get_current_car_status, get_software_update_history
Battery & health: get_battery_health_summary, get_battery_degradation_over_time, get_daily_battery_usage_patterns, get_tire_pressure_weekly_trends
Driving: get_monthly_driving_summary, get_daily_driving_patterns, get_longest_drives_by_distance, get_total_distance_and_efficiency, get_drive_summary_per_day
Efficiency: get_efficiency_by_month_and_temperature, get_average_efficiency_by_temperature, get_unusual_power_consumption
Charging & location: get_charging_by_location, get_all_charging_sessions_summary, get_most_visited_locations
get_database_schema— current TeslaMate schema (one row per column)run_sql(query)— execute a customSELECTorWITH … SELECT
-
Drop a SELECT into
src/teslamate_mcp/queries/your_query.sql. -
Add a sibling
your_query.toml:name = "get_your_data" description = "What this returns."
-
Restart the server. The registry picks it up automatically.
uv sync # install with dev deps
uv run ruff check src tests # lint
uv run ruff format src tests # format
uv run pytest # tests (Docker-backed integration tests skip if Docker is absent)MIT — see LICENSE.