Skip to main content

A read-only Model Context Protocol (MCP) server for ClickHouse: metadata discovery, parameterized queries, and execution plan analysis.

Project description

MCP ClickHouse Tool

Build Status PyPI Version

A read-only Model Context Protocol (MCP) server for ClickHouse that supports metadata discovery, resources, parameterized queries, and query analysis, with profile-based configuration and strict no-DML/DDL enforcement.

Requirements: Python 3.13+, a running ClickHouse instance, and connection details via environment variables.

Quick start

Set a DSN and run the server with MCP Inspector:

# Option 1: Run directly with uvx (no clone needed)
export MCP_CLICKHOUSE_DSN="http://default:@localhost:8123/default"
npx -y @modelcontextprotocol/inspector uvx mcp-clickhousex
# Option 2: Run from source (clone repo, then)
export MCP_CLICKHOUSE_DSN="http://default:@localhost:8123/default"
npx -y @modelcontextprotocol/inspector uv run main.py

Configuration

Connection and behavior are configured via environment variables. The server supports multiple named profiles and a backward-compatible flat layer for single-connection setups.

Single connection (flat env vars)

Flat vars create or override the default profile. This is all you need for a single ClickHouse instance:

export MCP_CLICKHOUSE_DSN="http://user:password@host:8123/database"
export MCP_CLICKHOUSE_DESCRIPTION="Primary cluster"                   # optional
export MCP_CLICKHOUSE_QUERY_MAX_ROWS="5000"                          # default: 5000 (capped at 50000)
export MCP_CLICKHOUSE_QUERY_COMMAND_TIMEOUT_SECONDS="30"             # default: 30 (capped at 300)

Multiple profiles (structured env vars)

To connect to more than one ClickHouse instance, use the MCP_CLICKHOUSE_PROFILES_<NAME>_ prefix. Profile names must be alphanumeric (no underscores) and are case-insensitive.

# Default profile
export MCP_CLICKHOUSE_PROFILES_DEFAULT_DSN="http://user:pass@primary:8123/mydb"
export MCP_CLICKHOUSE_PROFILES_DEFAULT_DESCRIPTION="Primary cluster"
export MCP_CLICKHOUSE_PROFILES_DEFAULT_QUERY_MAX_ROWS="5000"
export MCP_CLICKHOUSE_PROFILES_DEFAULT_QUERY_COMMAND_TIMEOUT_SECONDS="60"

# Named profile
export MCP_CLICKHOUSE_PROFILES_WAREHOUSE_DSN="http://user:pass@warehouse:8123/analytics"
export MCP_CLICKHOUSE_PROFILES_WAREHOUSE_DESCRIPTION="Analytics warehouse"
export MCP_CLICKHOUSE_PROFILES_WAREHOUSE_QUERY_MAX_ROWS="10000"
export MCP_CLICKHOUSE_PROFILES_WAREHOUSE_QUERY_COMMAND_TIMEOUT_SECONDS="120"

Per-profile fields:

Suffix Description Default
DSN Connection DSN (required) http://default:@localhost:8123/default
DESCRIPTION Human-readable label
QUERY_MAX_ROWS Row cap per query 5000 (max 50000)
QUERY_COMMAND_TIMEOUT_SECONDS Query timeout 30 (max 300)

Merge rule: Flat vars always feed into the default profile. If both MCP_CLICKHOUSE_PROFILES_DEFAULT_* and flat vars are set, flat vars win on conflict.

Max rows is applied to every query (server-side via max_result_rows); results may be truncated with a truncated and row_limit field in the response.

Tools

Tool Description Key params
list_profiles List configured profiles (name and optional description).
get_cluster_properties Get cluster (node) version and execution limits for a profile. profile (optional)
run_query Execute a read-only SELECT and return tabular results. Database/table must be specified in the SQL (e.g. db.table). Applies the profile's max rows limit. sql, parameters (optional), profile (optional)
analyze_query Analyze a read-only SELECT via EXPLAIN (plan with index usage, pipeline, syntax). sql, parameters (optional), types (optional), database (optional), profile (optional)
list_databases List all databases. profile (optional)
list_tables List tables and views in a database. Returns name, engine, primary_key, sorting_key, partition_key, total_rows, total_bytes for query analysis. database (optional), profile (optional)
list_columns List columns for a table or view. table, database (optional), profile (optional)

Resources

The server exposes the same discovery and metadata as the tools above via URI-addressable resources (profile-first hierarchy). All resource content is JSON (application/json). Use path segment default for the default profile or database.

Resource URI Description
Profiles clickhouse://profiles List configured profiles (same as list_profiles)
Cluster properties clickhouse://profiles/{profile}/cluster-properties Cluster version and limits for a profile
Databases clickhouse://profiles/{profile}/databases List databases for a profile
Tables clickhouse://profiles/{profile}/databases/{database}/tables List tables for a profile and database
Table columns clickhouse://profiles/{profile}/databases/{database}/tables/{table}/columns List columns for a table

Security

Read-only (SELECT only); parameterized queries supported (%(name)s or {name:Type} syntax). Use environment variables for connection credentials — never commit secrets.

MCP host examples

Snippets for common MCP clients using uvx mcp-clickhousex (no clone required; ensure uv is on your PATH). Replace connection details as needed.

Cursor

{
  "mcpServers": {
    "clickhouse": {
      "command": "uvx",
      "args": ["mcp-clickhousex"],
      "env": {
        "MCP_CLICKHOUSE_DSN": "http://default:@localhost:8123/default"
      }
    }
  }
}

Codex

[mcp_servers.clickhouse]
command = "uvx"
args = ["mcp-clickhousex"]

[mcp_servers.clickhouse.env]
MCP_CLICKHOUSE_DSN = "http://default:@localhost:8123/default"

OpenCode

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "clickhouse": {
      "type": "local",
      "enabled": true,
      "command": ["uvx", "mcp-clickhousex"],
      "environment": {
        "MCP_CLICKHOUSE_DSN": "http://default:@localhost:8123/default"
      }
    }
  }
}

GitHub Copilot (agent)

{
  "inputs": [],
  "servers": {
    "clickhouse": {
      "type": "stdio",
      "command": "uvx",
      "args": ["mcp-clickhousex"],
      "env": {
        "MCP_CLICKHOUSE_DSN": "http://default:@localhost:8123/default"
      }
    }
  }
}

Config file locations: Cursor .cursor/mcp.json, Codex/Copilot/OpenCode vary by client; see your client's MCP docs.

Tests

Tests require a running ClickHouse instance. The test suite creates a sample table in the default database, seeds it, and drops it after.

# Run all tests (unit + functional + e2e)
uv run pytest tests/ -v

The test harness uses MCP_TEST_CLICKHOUSE_DSN to locate the ClickHouse instance. If unset, it falls back to http://admin:password123@localhost:8123/default. Set the variable to point tests at a different server without affecting your production MCP_CLICKHOUSE_DSN:

export MCP_TEST_CLICKHOUSE_DSN="http://user:pass@testhost:8123/default"
uv run pytest tests/ -v

Roadmap

No planned features at this time. Open an issue to suggest improvements.

Contributing

Open issues or PRs; follow existing style and add tests where appropriate.

License

MIT. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mcp_clickhousex-0.2.0.tar.gz (69.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mcp_clickhousex-0.2.0-py3-none-any.whl (13.9 kB view details)

Uploaded Python 3

File details

Details for the file mcp_clickhousex-0.2.0.tar.gz.

File metadata

  • Download URL: mcp_clickhousex-0.2.0.tar.gz
  • Upload date:
  • Size: 69.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for mcp_clickhousex-0.2.0.tar.gz
Algorithm Hash digest
SHA256 af1b2f8da7f7adf1255a4066e65d8d0ef12fdc9781aa28b851ba4e10ebb91d16
MD5 dd30c58c7a4c9fead679c36a4d7d726e
BLAKE2b-256 9b7b25e529c44b60a67928cd733fdd8ea3d54c6689875538ca88c9932aa2c6da

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcp_clickhousex-0.2.0.tar.gz:

Publisher: ci.yml on alyiox/mcp-clickhousex

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mcp_clickhousex-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for mcp_clickhousex-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6e1bf00ca01022c46786e78c3f06fc4087827b8ada97b9f616de070fa7179ccd
MD5 32f7e8259dba7b1215c1942dd014df66
BLAKE2b-256 04e8a474678cb93dfc57db38121873724a853a1da292f93d921ec3ac408aee35

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcp_clickhousex-0.2.0-py3-none-any.whl:

Publisher: ci.yml on alyiox/mcp-clickhousex

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page