mcp-clickhouse
OfficialClickHouse MCP Server
Un servidor MCP para ClickHouse.
Características
Herramientas de ClickHouse
run_queryEjecuta consultas SQL en tu clúster de ClickHouse.
Entrada:
query(string): la consulta SQL a ejecutar.Las consultas se ejecutan en modo de solo lectura por defecto (
CLICKHOUSE_ALLOW_WRITE_ACCESS=false), pero la escritura se puede habilitar explícitamente si es necesario.
list_databasesLista todas las bases de datos de tu clúster de ClickHouse.
list_tablesLista las tablas de una base de datos con paginación.
Entrada obligatoria:
database(string).Entradas opcionales:
like/not_like(string): aplica filtrosLIKEoNOT LIKEa los nombres de las tablas.page_token(string): token devuelto por una llamada anterior para obtener la siguiente página.page_size(int, por defecto50): número de tablas devueltas por página.include_detailed_columns(bool, por defectotrue): cuando esfalse, omite los metadatos de las columnas para respuestas más ligeras, manteniendo la consultacreate_table_querycompleta.
Forma de la respuesta:
tables: array de objetos de tabla para la página actual.next_page_token: pasa este valor de vuelta para obtener la siguiente página, onullcuando no hay más tablas.total_tables: número total de tablas que coinciden con los filtros proporcionados.
Herramientas de chDB
run_chdb_select_queryEjecuta consultas SQL usando el motor ClickHouse integrado de chDB.
Entrada:
query(string): la consulta SQL a ejecutar.Consulta datos directamente desde varias fuentes (archivos, URLs, bases de datos) sin procesos ETL.
Requiere el extra opcional
chdb:pip install 'mcp-clickhouse[chdb]'
Endpoint de comprobación de salud
Cuando se ejecuta con transporte HTTP o SSE, hay un endpoint de comprobación de salud disponible en /health. Este endpoint:
Devuelve
200 OK(cuerpo:OK) si el servidor está sano y puede conectarse a ClickHouseDevuelve
503 Service Unavailablecon un mensaje de error genérico si el servidor no puede conectarse a ClickHouse
Las peticiones GET y HEAD al endpoint no están autenticadas a propósito y están exentas de la validación de Host y Origin para que las sondas del orquestador (p. ej. sondeos de liveness/readiness de Kubernetes, balanceadores de carga) puedan usar IPs de pod o de destino asignadas en tiempo de ejecución sin configuración adicional. /health está reservado y no puede usarse como ruta de transporte MCP. El cuerpo de la respuesta es deliberadamente mínimo para evitar filtrar cadenas de versión del backend o detalles de error; depura los fallos a través de los registros del servidor.
Ejemplo:
curl http://localhost:8000/health
# Response: OKRelated MCP server: ClickHouse MCP Server
Seguridad
Autenticación para transportes HTTP/SSE
Cuando se usa transporte HTTP o SSE, la autenticación es obligatoria por defecto. El transporte stdio (por defecto) no requiere autenticación, ya que solo se comunica a través de la entrada/salida estándar.
Se admiten tres modos de autenticación. Elige uno:
Modo | Cuándo usarlo | Variable de entorno |
Token estático de portador | Despliegues sencillos, servicios internos |
|
OAuth / OIDC (vía FastMCP) | Azure Entra, Google, GitHub, WorkOS, etc. |
|
Deshabilitado | Solo desarrollo local |
|
El arranque falla si no se configura ninguna de estas opciones para los transportes HTTP/SSE.
Configuración de la autenticación
Genera un token seguro (puede ser cualquier cadena aleatoria):
# Using uuidgen (macOS/Linux) uuidgen # Using openssl openssl rand -hex 32Configura el servidor con el token:
export CLICKHOUSE_MCP_AUTH_TOKEN="your-generated-token"Configura tu cliente MCP para que incluya el token en las peticiones:
Para Claude Desktop con transporte HTTP/SSE:
{ "mcpServers": { "mcp-clickhouse": { "url": "http://127.0.0.1:8000", "headers": { "Authorization": "Bearer your-generated-token" } } } }Nota: el endpoint
/healthno está autenticado a propósito (consulta Endpoint de comprobación de salud más arriba). Para verificar que la autenticación con token de portador está rechazando realmente las peticiones no autenticadas, prueba el propio endpoint MCP, por ejemplo con el MCP Inspector, o enviando una petición JSON-RPC a/mcpcon y sin la cabeceraAuthorizationy confirmando que la llamada no autenticada devuelve401.
OAuth / OIDC vía FastMCP
Para despliegues en producción con proveedores de identidad (Azure Entra, Google, GitHub, WorkOS, etc.), delega la autenticación en los proveedores de autenticación integrados de FastMCP en lugar de usar un token estático. Establece FASTMCP_SERVER_AUTH en la ruta de clase completa de un proveedor de autenticación de FastMCP, junto con las variables FASTMCP_SERVER_AUTH_* específicas del proveedor, y deja CLICKHOUSE_MCP_AUTH_TOKEN sin definir.
Ejemplo (Azure Entra):
export FASTMCP_SERVER_AUTH=fastmcp.server.auth.providers.azure.AzureProvider
export FASTMCP_SERVER_AUTH_AZURE_TENANT_ID="<tenant-id>"
export FASTMCP_SERVER_AUTH_AZURE_CLIENT_ID="<client-id>"
export FASTMCP_SERVER_AUTH_AZURE_CLIENT_SECRET="<client-secret>"Consulta la documentación de FastMCP para ver la lista completa de proveedores y sus variables de entorno necesarias.
Modo de desarrollo (deshabilitar la autenticación)
Solo para desarrollo y pruebas locales, puedes deshabilitar la autenticación estableciendo:
export CLICKHOUSE_MCP_AUTH_DISABLED=true
export CLICKHOUSE_MCP_ALLOWED_HOSTS=127.0.0.1:8000,localhost:8000ADVERTENCIA: usa esto solo para desarrollo local. No deshabilites la autenticación cuando el servidor esté expuesto a cualquier red.
Configuración
Este servidor MCP admite tanto ClickHouse como chDB. Puedes habilitar uno u otro, o ambos, según tus necesidades.
Abre el archivo de configuración de Claude Desktop ubicado en:
En macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonEn Windows:
%APPDATA%/Claude/claude_desktop_config.json
Añade lo siguiente:
{
"mcpServers": {
"mcp-clickhouse": {
"command": "uv",
"args": [
"run",
"--with",
"mcp-clickhouse",
"--python",
"3.10",
"mcp-clickhouse"
],
"env": {
"CLICKHOUSE_HOST": "<clickhouse-host>",
"CLICKHOUSE_PORT": "<clickhouse-port>",
"CLICKHOUSE_USER": "<clickhouse-user>",
"CLICKHOUSE_PASSWORD": "<clickhouse-password>",
"CLICKHOUSE_ROLE": "<clickhouse-role>",
"CLICKHOUSE_SECURE": "true",
"CLICKHOUSE_VERIFY": "true",
"CLICKHOUSE_CONNECT_TIMEOUT": "30",
"CLICKHOUSE_SEND_RECEIVE_TIMEOUT": "30"
}
}
}
}Actualiza las variables de entorno para que apunten a tu propio servicio de ClickHouse.
O, si quieres probarlo con el ClickHouse SQL Playground, puedes usar la siguiente configuración:
{
"mcpServers": {
"mcp-clickhouse": {
"command": "uv",
"args": [
"run",
"--with",
"mcp-clickhouse",
"--python",
"3.10",
"mcp-clickhouse"
],
"env": {
"CLICKHOUSE_HOST": "sql-clickhouse.clickhouse.com",
"CLICKHOUSE_PORT": "8443",
"CLICKHOUSE_USER": "demo",
"CLICKHOUSE_PASSWORD": "",
"CLICKHOUSE_SECURE": "true",
"CLICKHOUSE_VERIFY": "true",
"CLICKHOUSE_CONNECT_TIMEOUT": "30",
"CLICKHOUSE_SEND_RECEIVE_TIMEOUT": "30"
}
}
}
}Para chDB (motor ClickHouse integrado), añade la siguiente configuración:
{
"mcpServers": {
"mcp-clickhouse": {
"command": "uv",
"args": [
"run",
"--with",
"mcp-clickhouse[chdb]",
"--python",
"3.10",
"mcp-clickhouse"
],
"env": {
"CHDB_ENABLED": "true",
"CLICKHOUSE_ENABLED": "false",
"CHDB_DATA_PATH": "/path/to/chdb/data"
}
}
}
}También puedes habilitar ClickHouse y chDB a la vez:
{
"mcpServers": {
"mcp-clickhouse": {
"command": "uv",
"args": [
"run",
"--with",
"mcp-clickhouse[chdb]",
"--python",
"3.10",
"mcp-clickhouse"
],
"env": {
"CLICKHOUSE_HOST": "<clickhouse-host>",
"CLICKHOUSE_PORT": "<clickhouse-port>",
"CLICKHOUSE_USER": "<clickhouse-user>",
"CLICKHOUSE_PASSWORD": "<clickhouse-password>",
"CLICKHOUSE_SECURE": "true",
"CLICKHOUSE_VERIFY": "true",
"CLICKHOUSE_CONNECT_TIMEOUT": "30",
"CLICKHOUSE_SEND_RECEIVE_TIMEOUT": "30",
"CHDB_ENABLED": "true",
"CHDB_DATA_PATH": "/path/to/chdb/data"
}
}
}
}Localiza la entrada de comando de
uvy sustitúyela por la ruta absoluta al ejecutable deuv. Esto garantiza que se use la versión correcta deuval iniciar el servidor. En un Mac, puedes encontrar esta ruta usandowhich uv.Reinicia Claude Desktop para aplicar los cambios.
Acceso de escritura opcional
Por defecto, este MCP aplica consultas de solo lectura para que no puedan producirse mutaciones accidentales durante la exploración. Para permitir sentencias DDL o INSERT, establece la variable de entorno CLICKHOUSE_ALLOW_WRITE_ACCESS en true. El servidor sigue aplicando el modo de solo lectura si la propia instancia de ClickHouse no permite escrituras.
Protección contra operaciones destructivas
Incluso cuando el acceso de escritura está habilitado (CLICKHOUSE_ALLOW_WRITE_ACCESS=true), las operaciones destructivas requieren una bandera de aceptación adicional por seguridad. La comprobación cubre cualquier sentencia DROP (incluidas las cláusulas ALTER TABLE ... DROP PARTITION / DROP PART / DROP COLUMN), cualquier TRUNCATE, DELETE y UPDATE (tanto las sentencias ligeras como las mutaciones ALTER TABLE ... DELETE / ALTER TABLE ... UPDATE), REPLACE TABLE, CREATE OR REPLACE, ALTER TABLE ... REPLACE PARTITION, ALTER TABLE ... CLEAR COLUMN / CLEAR INDEX / CLEAR PROJECTION y DETACH ... PERMANENTLY. Las palabras clave dentro de literales de cadena, identificadores entre comillas y comentarios SQL se ignoran, por lo que ni activan la comprobación ni ocultan una sentencia a la misma.
Esta comprobación se ejecuta en el servidor MCP y es una protección de mejor esfuerzo contra accidentes. No es un límite de seguridad. El límite de seguridad son los permisos del usuario de ClickHouse. El modo de solo lectura (el predeterminado) se aplica en el lado del servidor mediante readonly=1. La barrera de operaciones destructivas no se aplica en el servidor.
Para el modo de escritura, asigna al servidor MCP un usuario de ClickHouse dedicado con solo los privilegios que necesite:
CREATE USER mcp_agent IDENTIFIED BY '...';
GRANT SELECT, INSERT, CREATE TABLE, ALTER ADD COLUMN ON mydb.* TO mcp_agent;Cualquier sentencia fuera de estos permisos falla entonces en el lado del servidor con ACCESS_DENIED, independientemente de las banderas de MCP. Los ajustes del servidor max_table_size_to_drop y max_partition_size_to_drop también pueden limitar el radio del daño si se fijan con restricciones de ajustes.
Para habilitar las operaciones destructivas, establece ambas banderas:
"env": {
"CLICKHOUSE_ALLOW_WRITE_ACCESS": "true",
"CLICKHOUSE_ALLOW_DROP": "true"
}Este enfoque de dos niveles dificulta la eliminación accidental:
Operaciones de escritura (INSERT, CREATE, ALTER ADD COLUMN) requieren
CLICKHOUSE_ALLOW_WRITE_ACCESS=trueOperaciones destructivas (DROP, TRUNCATE, DELETE, UPDATE y el resto de la lista anterior) requieren además
CLICKHOUSE_ALLOW_DROP=true
Ejecución sin uv (usando Python del sistema)
Si prefieres usar la instalación de Python del sistema en lugar de uv, puedes instalar el paquete desde PyPI y ejecutarlo directamente:
Instala el paquete usando pip:
python3 -m pip install mcp-clickhousePara instalar también el soporte de chDB:
python3 -m pip install 'mcp-clickhouse[chdb]'Para actualizar a la última versión:
python3 -m pip install --upgrade mcp-clickhouseActualiza tu configuración de Claude Desktop para usar Python directamente:
{
"mcpServers": {
"mcp-clickhouse": {
"command": "python3",
"args": [
"-m",
"mcp_clickhouse.main"
],
"env": {
"CLICKHOUSE_HOST": "<clickhouse-host>",
"CLICKHOUSE_PORT": "<clickhouse-port>",
"CLICKHOUSE_USER": "<clickhouse-user>",
"CLICKHOUSE_PASSWORD": "<clickhouse-password>",
"CLICKHOUSE_SECURE": "true",
"CLICKHOUSE_VERIFY": "true",
"CLICKHOUSE_CONNECT_TIMEOUT": "30",
"CLICKHOUSE_SEND_RECEIVE_TIMEOUT": "30"
}
}
}
}Alternativamente, puedes usar el script instalado directamente:
{
"mcpServers": {
"mcp-clickhouse": {
"command": "mcp-clickhouse",
"env": {
"CLICKHOUSE_HOST": "<clickhouse-host>",
"CLICKHOUSE_PORT": "<clickhouse-port>",
"CLICKHOUSE_USER": "<clickhouse-user>",
"CLICKHOUSE_PASSWORD": "<clickhouse-password>",
"CLICKHOUSE_SECURE": "true",
"CLICKHOUSE_VERIFY": "true",
"CLICKHOUSE_CONNECT_TIMEOUT": "30",
"CLICKHOUSE_SEND_RECEIVE_TIMEOUT": "30"
}
}
}
}Nota: asegúrate de usar la ruta completa al ejecutable de Python o al script mcp-clickhouse si no están en tu PATH del sistema. Puedes encontrar las rutas usando:
which python3para el ejecutable de Pythonwhich mcp-clickhousepara el script instalado
Middleware personalizado
Puedes añadir middleware personalizado al servidor MCP sin modificar el código fuente. FastMCP proporciona un sistema de middleware que te permite interceptar y procesar los mensajes del protocolo MCP (llamadas a herramientas, lecturas de recursos, prompts, etc.).
Cómo usarlo
Crea un módulo de Python con clases de middleware que extiendan
Middlewarey una funciónsetup_middleware(mcp):
# my_middleware.py
import logging
from fastmcp.server.middleware import Middleware, MiddlewareContext, CallNext
logger = logging.getLogger("my-middleware")
class LoggingMiddleware(Middleware):
"""Log all tool calls."""
async def on_call_tool(self, context: MiddlewareContext, call_next: CallNext):
tool_name = context.message.name if hasattr(context.message, 'name') else 'unknown'
logger.info(f"Calling tool: {tool_name}")
result = await call_next(context)
logger.info(f"Tool {tool_name} completed")
return result
def setup_middleware(mcp):
"""Register middleware with the MCP server."""
mcp.add_middleware(LoggingMiddleware())Establece la variable de entorno
MCP_MIDDLEWARE_MODULEal nombre del módulo (sin la extensión.py):
{
"mcpServers": {
"mcp-clickhouse": {
"command": "uv",
"args": ["run", "--with", "mcp-clickhouse", "--python", "3.10", "mcp-clickhouse"],
"env": {
"CLICKHOUSE_HOST": "<clickhouse-host>",
"CLICKHOUSE_USER": "<clickhouse-user>",
"CLICKHOUSE_PASSWORD": "<clickhouse-password>",
"MCP_MIDDLEWARE_MODULE": "my_middleware"
}
}
}
}Asegúrate de que tu módulo de middleware esté en la ruta de importación de Python (p. ej., en el mismo directorio donde se ejecuta el servidor MCP, o instalado como paquete).
Ejemplo de middleware
En example_middleware.py se proporciona un módulo de middleware de ejemplo que muestra patrones comunes:
Registrar todas las peticiones MCP
Registrar las llamadas a herramientas específicamente
Medir el tiempo de procesamiento de las peticiones
Para usar el ejemplo:
"env": {
"MCP_MIDDLEWARE_MODULE": "example_middleware"
}Capacidades del middleware
La clase base Middleware proporciona hooks para diferentes operaciones de MCP:
on_message(context, call_next)- Se llama para todos los mensajeson_request(context, call_next)- Se llama para todas las peticioneson_notification(context, call_next)- Se llama para todas las notificacioneson_call_tool(context, call_next)- Se llama cuando se ejecuta una herramientaon_read_resource(context, call_next)- Se llama cuando se lee un recursoon_get_prompt(context, call_next)- Se llama cuando se recupera un prompton_list_tools(context, call_next)- Se llama al listar herramientason_list_resources(context, call_next)- Se llama al listar recursoson_list_resource_templates(context, call_next)- Se llama al listar plantillas de recursoson_list_prompts(context, call_next)- Se llama al listar prompts
Cada hook recibe un objeto MiddlewareContext que contiene el mensaje y los metadatos, y una función call_next para continuar el pipeline.
Configuración dinámica del cliente mediante el estado de contexto
El middleware puede sobrescribir la configuración del cliente de ClickHouse por petición usando la clave de estado de contexto CLIENT_CONFIG_OVERRIDES_KEY. El servidor combina estas sobrescrituras con la configuración base de las variables de entorno.
from fastmcp.server.dependencies import get_context
from mcp_clickhouse.mcp_server import CLIENT_CONFIG_OVERRIDES_KEY
ctx = get_context()
ctx.set_state(CLIENT_CONFIG_OVERRIDES_KEY, {
"connect_timeout": 60,
"send_receive_timeout": 120
})Esto permite casos de uso avanzados como ajustes dinámicos de tiempo de espera, enrutamiento específico por inquilino o ajustes de conexión por usuario.
El valor de estado debe ser un diccionario. Los valores anidados de settings y generic_args deben ser mapeos y se fusionan con la configuración base. Los valores no válidos hacen fallar la llamada a la herramienta antes de que se cree un cliente de ClickHouse. CLICKHOUSE_ROLE permanece activo a menos que la anulación proporcione explícitamente settings.role. Las claves de nivel superior role y ch_role, así como las mismas claves dentro de generic_args, se rechazan.
Trate estas anulaciones como entrada de middleware de confianza. El middleware debe autenticar y autorizar los valores derivados de la solicitud antes de establecerlos. Un rol de ClickHouse por solicitud es configuración de conexión, no un límite de autorización de inquilino (tenant). Aplique el aislamiento de inquilinos con usuarios, roles y permisos (grants) de ClickHouse.
Desarrollo
En el directorio
test-services, ejecutedocker compose up -dpara iniciar el clúster de ClickHouse.Añada las siguientes variables a un archivo
.enven la raíz del repositorio.
Nota: El uso del usuario default en este contexto está destinado únicamente a fines de desarrollo local.
CLICKHOUSE_HOST=localhost
CLICKHOUSE_PORT=8123
CLICKHOUSE_USER=default
CLICKHOUSE_PASSWORD=clickhouseEjecute
uv syncpara instalar las dependencias. Para instalaruv, siga las instrucciones aquí. Luego ejecutesource .venv/bin/activate.Para probar fácilmente con MCP Inspector, ejecute
fastmcp dev mcp_clickhouse/mcp_server.pypara iniciar el servidor MCP.Para probar con el transporte HTTP y el endpoint de comprobación de estado (health check):
# For development, disable authentication CLICKHOUSE_MCP_SERVER_TRANSPORT=http CLICKHOUSE_MCP_AUTH_DISABLED=true CLICKHOUSE_MCP_ALLOWED_HOSTS=127.0.0.1:8000,localhost:8000 python -m mcp_clickhouse.main # Or with authentication (generate a token first) CLICKHOUSE_MCP_SERVER_TRANSPORT=http CLICKHOUSE_MCP_AUTH_TOKEN="your-token" python -m mcp_clickhouse.main # Then in another terminal: curl http://localhost:8000/health
Variables de Entorno
La configuración se divide en grupos independientes. Mezclarlos es una causa común de fallos de conexión difíciles de depurar:
Grupo | Variables | Control |
Conexión a la base de datos ClickHouse |
| Cómo este servidor MCP se conecta a su clúster de ClickHouse a través de la interfaz HTTP |
Servidor MCP / transporte |
| Transporte MCP, autenticación y límites de ejecución de las herramientas de consulta |
Middleware / chDB |
| Extensiones opcionales |
[!IMPORTANT] Variables como
CLICKHOUSE_SECURE,CLICKHOUSE_VERIFYyCLICKHOUSE_PORTse aplican únicamente a la conexión con la base de datos ClickHouse. No configuran TLS, puertos ni autenticación para el endpoint del protocolo MCP.Ejemplo: si el servidor MCP se ejecuta en Kubernetes detrás de un ingress que termina TLS, eso es un asunto del transporte MCP. Mantenga
CLICKHOUSE_SECUREalineado con la forma en que el pod llega al propio ClickHouse (HTTPS →true, HTTP simple →false). EstablecerCLICKHOUSE_SECURE=falseporque el servidor MCP está detrás de un ingress hará que el servidor se conecte a ClickHouse por HTTP —a menudo contra un puerto exclusivo de HTTPS— y producirá errores HTTP/TLS opacos en los registros del servidor.
Conexión a la base de datos ClickHouse
Estas variables configuran el cliente HTTP clickhouse-connect y el comportamiento de las herramientas basadas en ClickHouse, como run_query, list_databases y list_tables.
Variables Obligatorias
CLICKHOUSE_HOST: El nombre de host de su servidor ClickHouse (endpoint de la base de datos, no la dirección de enlace del servidor MCP)CLICKHOUSE_USER: El nombre de usuario para la autenticación en ClickHouseCLICKHOUSE_PASSWORD: La contraseña para la autenticación en ClickHouse
[!CAUTION] Es importante tratar a su usuario de base de datos MCP como lo haría con cualquier cliente externo que se conecte a su base de datos, concediendo únicamente los privilegios mínimos necesarios para su funcionamiento. El uso de usuarios por defecto o administrativos debe evitarse estrictamente en todo momento.
Variables Opcionales
CLICKHOUSE_PORT: Puerto de la interfaz HTTP de su servidor ClickHouseValor por defecto:
8443siCLICKHOUSE_SECURE=true,8123siCLICKHOUSE_SECURE=falseNormalmente no es necesario configurarlo a menos que se utilice un puerto no estándar
Debe ser un puerto de la interfaz HTTP, no el puerto del protocolo TCP nativo utilizado por
clickhouse-clientValores comunes:
HTTP:
8123(sin TLS) /8443(TLS) — utilizado por este servidor y por ClickHouse Cloud HTTPSTCP nativo (no compatible aquí):
9000(sin TLS) /9440(TLS) — utilizado porclickhouse-client
Si el servidor responde con
Port 9000 is for clickhouse-client program, está apuntando al protocolo nativo; cambie al puerto HTTP (8123/8443o la asignación HTTP de su despliegue)
CLICKHOUSE_ROLE: El rol de ClickHouse que se utilizará para la autenticaciónValor por defecto: None
Configúrelo si su usuario requiere un rol específico
CLICKHOUSE_SECURE: Habilite HTTPS para la conexión a la base de datos ClickHouse (no para los clientes MCP)Valor por defecto:
"true"Establézcalo en
"false"solo cuando el servidor MCP llegue a ClickHouse por HTTP simple (típico en Docker Compose local en el puerto8123)Déjelo en
"true"para ClickHouse Cloud y cualquier endpoint de base de datos HTTPS, incluso si el propio servidor MCP se expone por HTTP, stdio o un ingress que termina TLS por separadoNo hacer coincidir este indicador con el puerto de la base de datos (p. ej.,
CLICKHOUSE_SECURE=falsecontra el puerto8443) es un error de configuración frecuente que suele manifestarse como errores confusos del cliente HTTP en lugar de un mensaje claro de «esquema incorrecto»
CLICKHOUSE_VERIFY: Habilite/deshabilite la verificación de certificados SSL para la conexión HTTPS a ClickHouseValor por defecto:
"true"Establézcalo en
"false"para deshabilitar la verificación de certificados (no recomendado para producción)Certificados TLS: el paquete utiliza el almacén de confianza de su sistema operativo para la verificación de certificados TLS mediante
truststore. Llamamos atruststore.inject_into_ssl()al inicio para garantizar un manejo correcto de los certificados. El comportamiento SSL predeterminado de Python se utiliza como respaldo solo si se produce un error inesperado.
CLICKHOUSE_SERVER_HOST_NAME: Nombre de host del servidor para la anulación de SNI y la validación de certificados en la conexión a ClickHouseValor por defecto: None (utiliza el nombre de host de la conexión)
Es útil al conectarse a través de proxies o balanceadores de carga donde el nombre de host del certificado difiere del nombre de host de la conexión. Cuando se establece, este nombre de host se utilizará tanto para SNI (Server Name Indication) durante el handshake TLS como para la validación del nombre de host del certificado.
CLICKHOUSE_PROXY_PATH: Prefijo de ruta URL para el endpoint HTTP de ClickHouseValor por defecto: None
Configúrelo cuando la interfaz HTTP de ClickHouse esté expuesta detrás de un proxy inverso bajo un prefijo de ruta (por ejemplo,
/clickhouse)
CLICKHOUSE_CONNECT_TIMEOUT: Tiempo de espera de conexión en segundos para el cliente de ClickHouseValor por defecto:
"30"Aumente este valor si experimenta tiempos de espera de conexión
CLICKHOUSE_SEND_RECEIVE_TIMEOUT: Tiempo de espera de envío/recepción en segundos para el cliente de ClickHouseValor por defecto:
"300"Aumente este valor para consultas de larga duración
CLICKHOUSE_DATABASE: Base de datos ClickHouse predeterminada a utilizarValor por defecto: None (utiliza la predeterminada del servidor)
Configúrelo para conectarse automáticamente a una base de datos específica
CLICKHOUSE_ENABLED: Habilite/deshabilite las herramientas de base de datos de ClickHouseValor por defecto:
"true"Establézcalo en
"false"para deshabilitar las herramientas de ClickHouse cuando se utilice solo chDB
CLICKHOUSE_ALLOW_WRITE_ACCESS: Permita operaciones de escritura (DDL y DML) contra ClickHouseValor por defecto:
"false"Establézcalo en
"true"para permitir DDL y DML no destructivos (CREATE, INSERT, ALTER ADD COLUMN). Las sentencias destructivas además necesitanCLICKHOUSE_ALLOW_DROP=trueCuando está deshabilitado (valor por defecto), las consultas se ejecutan con el ajuste
readonly=1para evitar modificaciones de datos
CLICKHOUSE_ALLOW_DROP: Permita operaciones destructivas (cualquierDROPoTRUNCATE,DELETEyUPDATEincluidas las variantes deALTER TABLE,REPLACE TABLE/REPLACE PARTITION/CREATE OR REPLACE,CLEAR COLUMN/CLEAR INDEX/CLEAR PROJECTION, yDETACH ... PERMANENTLY)Valor por defecto:
"false"Solo tiene efecto cuando también se establece
CLICKHOUSE_ALLOW_WRITE_ACCESS=trueEsta compuerta es una protección contra accidentes de buena fe (best-effort) en el servidor MCP, no un límite de seguridad. Restrinja los permisos (grants) del usuario de ClickHouse para una aplicación real (consulte Protección de operaciones destructivas)
Servidor MCP y transporte
Estas variables controlan el propio proceso MCP, incluidos el transporte, la autenticación y los límites de ejecución de las herramientas de consulta. Son independientes de los ajustes de la base de datos ClickHouse mencionados anteriormente. Consulte también Autenticación para transportes HTTP/SSE.
CLICKHOUSE_MCP_SERVER_TRANSPORT: Establece el método de transporte para el servidor MCPValor por defecto:
"stdio"Opciones válidas:
"stdio","http","sse". Esto es útil para el desarrollo local con herramientas como MCP Inspector.stdioes lo habitual para Claude Desktop;http/sseexponen un listener de red (host/puerto de enlace más abajo)
CLICKHOUSE_MCP_BIND_HOST: Host al que enlazar el servidor MCP cuando se usa transporte HTTP o SSEValor por defecto:
"127.0.0.1"Configúrelo en
"0.0.0.0"para enlazar a todas las interfaces de red (útil para Docker o acceso remoto)Solo se usa cuando el transporte es
"http"o"sse"— no está relacionado conCLICKHOUSE_HOST
CLICKHOUSE_MCP_BIND_PORT: Puerto al que enlazar el servidor MCP cuando se usa transporte HTTP o SSEValor por defecto:
"8000"Solo se usa cuando el transporte es
"http"o"sse"— no está relacionado conCLICKHOUSE_PORT
CLICKHOUSE_MCP_QUERY_TIMEOUT: Tiempo de espera (timeout) en segundos para las herramientas de consultaValor por defecto:
"30"Auméntelo si ve errores
Query timed out after ...para consultas pesadas
CLICKHOUSE_MCP_AUTH_TOKEN: Token bearer estático para transportes HTTP/SSEValor por defecto: Ninguno
Uno de
CLICKHOUSE_MCP_AUTH_TOKEN,FASTMCP_SERVER_AUTHoCLICKHOUSE_MCP_AUTH_DISABLED=truees obligatorio para transportes HTTP/SSEGenérelo con
uuidgenoopenssl rand -hex 32Los clientes deben enviar este token en la cabecera
Authorization: Bearer <token>
FASTMCP_SERVER_AUTH: Delegar la autenticación a un proveedor de autenticación FastMCPValor por defecto: Ninguno
El valor es la ruta de clase completa de una subclase de AuthProvider, p. ej.
fastmcp.server.auth.providers.azure.AzureProviderofastmcp.server.auth.providers.google.GoogleProviderCuando se establece, FastMCP carga automáticamente el proveedor desde sus propias variables de entorno
FASTMCP_SERVER_AUTH_*; dejeCLICKHOUSE_MCP_AUTH_TOKENsin establecer en este modo
CLICKHOUSE_MCP_AUTH_DISABLED: Deshabilitar la autenticación para transportes HTTP/SSEValor por defecto:
"false"(la autenticación está habilitada)Configúrelo en
"true"para deshabilitar la autenticación solo para desarrollo/pruebas localesADVERTENCIA: Úselo solo para desarrollo local. No lo deshabilite cuando esté expuesto a redes
CLICKHOUSE_MCP_ALLOWED_HOSTS: Valores de cabeceraHostseparados por comas a los que responde el servidor HTTP/SSEValor por defecto para un enlace de loopback: formas sin puerto y con cualquier puerto de
127.0.0.1,localhosty[::1]Si se establece, el valor debe contener al menos una entrada Host.
Una dirección de enlace concreta no loopback usa por defecto esa dirección y el puerto configurado. Un enlace comodín como
0.0.0.0o::requiere un valor explícito no vacío porque el Host público no se puede inferir.La validación de Host es una defensa en profundidad contra el DNS rebinding. La validación de Origin que aparece más abajo la exige MCP por separado.
Las entradas son exactas (
localhost:8000) o aceptan cualquier puerto (localhost:*). Ejemplo:CLICKHOUSE_MCP_ALLOWED_HOSTS=127.0.0.1:8000,localhost:8000La forma
host:*solo coincide con valores que incluyen un puerto. Un Host sin puerto (un despliegue en puerto estándar donde el cliente omite:80/:443) también debe aparecer como una entrada exacta sin puerto (example.com).Las solicitudes con una cabecera
Hostque no coincide o falta reciben421 Misdirected Request. Las solicitudes GET y HEAD a/healthestán exentas de la validación de Host y Origin para que las sondas del orquestador sigan funcionando.Detrás de un proxy inverso, indique el valor de Host que reenvía el proxy. Establezca una lista explícita cuando un lanzador como
fastmcp runsobrescriba la dirección de enlace para el acceso remoto.
CLICKHOUSE_MCP_ALLOWED_ORIGINS: Valores de cabeceraOriginseparados por comas aceptados en HTTP/SSEValor por defecto: Ninguno, lo que rechaza toda solicitud que lleve una cabecera
OriginMCP exige la validación de Origin para las conexiones de transporte HTTP/SSE. Las solicitudes sin Origin se aceptan porque los clientes MCP que no son de navegador normalmente la omiten. Un Origin que no coincide recibe
403 Forbidden. El endpoint/healthestá exento como se ha descrito anteriormente.Las entradas son exactas (
http://localhost:3000) o aceptan cualquier puerto (http://localhost:*). Al igual que con los hosts, la forma con cualquier puerto solo coincide con orígenes que incluyen un puerto; un origen en puerto estándar (https://app.example.com) debe indicarse exactamente.
Variables de middleware
MCP_MIDDLEWARE_MODULE: Nombre del módulo Python que contiene el middleware personalizado que se inyecta en el servidor MCPValor por defecto: Ninguno (no se carga middleware)
Configúrelo con el nombre del módulo (sin la extensión
.py) de su módulo de middlewareEl módulo debe proporcionar una función
setup_middleware(mcp)Consulte Middleware personalizado para obtener detalles y ejemplos
Variables de chDB
CHDB_ENABLED: Habilita/deshabilita la funcionalidad de chDBValor por defecto:
"false"Configúrelo en
"true"para habilitar las herramientas de chDBRequiere instalar el extra opcional:
mcp-clickhouse[chdb]
CHDB_DATA_PATH: La ruta al directorio de datos de chDBValor por defecto:
":memory:"(base de datos en memoria)Use
:memory:para una base de datos en memoriaUse una ruta de archivo para almacenamiento persistente (p. ej.,
/path/to/chdb/data)
Errores comunes de configuración
CLICKHOUSE_SECUREfrente a TLS de MCP / ingress — DesactivarCLICKHOUSE_SECUREporque el servidor MCP está detrás de un ingress de Kubernetes, un proxy inverso, o se accede a él por HTTP simple no deshabilita el TLS de la base de datos; solo cambia cómo este proceso se conecta a ClickHouse. Configure el TLS del ingress por separado de los ajustes del cliente de base de datos.Puertos de protocolo nativo —
CLICKHOUSE_PORTdebe apuntar a la interfaz HTTP de ClickHouse (8123/8443por defecto). Los puertos9000/9440son para el protocolo TCP nativo (clickhouse-client) y no funcionarán con este servidor.Confusión de host —
CLICKHOUSE_HOSTes el nombre de host de la base de datos.CLICKHOUSE_MCP_BIND_HOSTes solo la dirección en la que escucha el servidor MCP HTTP/SSE.
Ejemplos de configuración
Para desarrollo local con Docker:
# Required variables
CLICKHOUSE_HOST=localhost
CLICKHOUSE_USER=default
CLICKHOUSE_PASSWORD=clickhouse
# Optional: Override defaults for local development
CLICKHOUSE_SECURE=false # Uses port 8123 automatically
CLICKHOUSE_VERIFY=falsePara ClickHouse Cloud:
# Required variables
CLICKHOUSE_HOST=your-instance.clickhouse.cloud
CLICKHOUSE_USER=default
CLICKHOUSE_PASSWORD=your-password
# Optional: These use secure defaults
# CLICKHOUSE_SECURE=true # Uses port 8443 automatically
# CLICKHOUSE_DATABASE=your_databasePara ClickHouse SQL Playground:
CLICKHOUSE_HOST=sql-clickhouse.clickhouse.com
CLICKHOUSE_USER=demo
CLICKHOUSE_PASSWORD=
# Uses secure defaults (HTTPS on port 8443)Para solo chDB (en memoria):
# chDB configuration
CHDB_ENABLED=true
CLICKHOUSE_ENABLED=false
# CHDB_DATA_PATH defaults to :memory:Para chDB con almacenamiento persistente:
# chDB configuration
CHDB_ENABLED=true
CLICKHOUSE_ENABLED=false
CHDB_DATA_PATH=/path/to/chdb/dataPara MCP Inspector o acceso remoto con transporte HTTP:
CLICKHOUSE_HOST=localhost
CLICKHOUSE_USER=default
CLICKHOUSE_PASSWORD=clickhouse
CLICKHOUSE_MCP_SERVER_TRANSPORT=http
CLICKHOUSE_MCP_BIND_HOST=0.0.0.0 # Bind to all interfaces
CLICKHOUSE_MCP_BIND_PORT=4200 # Custom port (default: 8000)
CLICKHOUSE_MCP_AUTH_TOKEN=your-generated-token # One auth mode required for HTTP/SSE (or FASTMCP_SERVER_AUTH, or CLICKHOUSE_MCP_AUTH_DISABLED=true)
CLICKHOUSE_MCP_ALLOWED_HOSTS=127.0.0.1:4200,localhost:4200,mcp.example.com:4200 # Include every Host value clients and proxies sendPara desarrollo local con transporte HTTP (autenticación deshabilitada):
CLICKHOUSE_HOST=localhost
CLICKHOUSE_USER=default
CLICKHOUSE_PASSWORD=clickhouse
CLICKHOUSE_MCP_SERVER_TRANSPORT=http
CLICKHOUSE_MCP_AUTH_DISABLED=true # Only for local development!
CLICKHOUSE_MCP_ALLOWED_HOSTS=127.0.0.1:8000,localhost:8000Cuando se usa transporte HTTP, el servidor se ejecutará en el puerto configurado (8000 por defecto). Por ejemplo, con la configuración anterior:
Endpoint MCP:
http://localhost:8000/mcpComprobación de salud:
http://localhost:8000/health
Puede establecer estas variables en su entorno, en un archivo .env o en la configuración de Claude Desktop:
{
"mcpServers": {
"mcp-clickhouse": {
"command": "uv",
"args": [
"run",
"--with",
"mcp-clickhouse",
"--python",
"3.10",
"mcp-clickhouse"
],
"env": {
"CLICKHOUSE_HOST": "<clickhouse-host>",
"CLICKHOUSE_USER": "<clickhouse-user>",
"CLICKHOUSE_PASSWORD": "<clickhouse-password>",
"CLICKHOUSE_DATABASE": "<optional-database>",
"CLICKHOUSE_MCP_SERVER_TRANSPORT": "stdio",
"CLICKHOUSE_MCP_BIND_HOST": "127.0.0.1",
"CLICKHOUSE_MCP_BIND_PORT": "8000"
}
}
}
}Nota: Los ajustes de host y puerto de enlace solo se usan cuando el transporte está configurado como "http" o "sse".
Ejecutar las pruebas
uv sync --all-extras --dev # install dev dependencies
uv run ruff check . # run linting
docker compose up -d test_services # start ClickHouse
uv run pytest -v tests
uv run pytest -v tests/test_tool.py # ClickHouse only
CHDB_ENABLED=true uv run --extra chdb pytest -v tests/test_chdb_tool.py # chDB onlyDescripción general de YouTube

Available Tools
3 toolslist_databasesList DatabasesA
List available ClickHouse databases
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of disclosing behavior. It merely says 'list available ClickHouse databases' without indicating that it is a read-only operation, whether it requires specific permissions, or what the return structure looks like (though an output schema exists). The description adds no behavioral context beyond the obvious intent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that directly states the function with no filler or redundancy. It is appropriately sized for a simple tool with no parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, zero parameters, and presence of an output schema, the description is sufficient for an agent to understand its core function. The lack of explicit usage alternatives is a minor gap, but for a basic listing tool, the description covers the essentials.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema is empty, so there is nothing for the description to explain about parameters. According to the rubric, a baseline of 4 is appropriate when no parameters exist, and the description does not need to add anything.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list' and the resource 'available ClickHouse databases', making the tool's purpose unambiguous. It distinguishes itself from siblings like list_tables (tables) and run_query (queries) by explicitly targeting databases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool versus the sibling tools. While the purpose is self-evident, there is no mention of scenarios where listing databases is preferred or when a different tool (e.g., list_tables) would be more appropriate. This leaves the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesList TablesA
List available ClickHouse tables in a database, including schema, comment, row count, and column count.
Integers outside [-9007199254740991, 9007199254740991] in table metadata are returned as decimal strings. Pagination tokens are single-use and retained for up to one hour.
| Name | Required | Description | Default |
|---|---|---|---|
| like | No | Optional LIKE pattern to filter table names | |
| database | Yes | The database to list tables from | |
| not_like | No | Optional NOT LIKE pattern to exclude table names | |
| page_size | No | Number of tables to return per page (default: 50, must be greater than 0) | |
| page_token | No | Single-use token from a previous call, retained for up to one hour | |
| include_detailed_columns | No | Whether to include detailed column metadata (default: True). When False, the columns array will be empty but create_table_query still contains all column information. This reduces payload size for large schemas. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It does disclose two non-obvious behaviors: large integers become decimal strings, and pagination tokens are single-use and retained for one hour. This is meaningful transparency, though it does not address all potential behaviors such as sorting or default pagination size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. The first sentence states the core purpose and output, and the following two sentences provide essential behavioral quirks. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema made available and 100% parameter coverage, the description does not need to restate return structures or parameter details. It adequately covers the non-obvious behaviors around large integers and pagination tokenshare tokens, making it largely complete for an agent to invoke correctly. It falls short of 5 because it lacks any guidance on when to prefer this over list_databases or run_query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter descriptions in the schema already cover 100% of parameters, including defaults and semantics. The description adds minor context around pagination token behavior and output metadata, but does not need to compensate for schema gaps. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists ClickHouse tables in a database and includes specific metadata fields (schema, comment, row count, column count). This distinguishes it from sibling tools list_databases and run_query based on the resource being operated on and the nature of the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for discovering table metadata, which contrasts with list_databases and run_query, but it never explicitly states when to use this tool over its siblings. There is no direct mention of alternatives or exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_queryRun QueryA
Execute SQL queries in ClickHouse. Queries run in read-only mode by default. Bind optional params by name with {name:Type} placeholders, such as {name:String} or {vector:Array(Float32)}. Values may be JSON scalars, nulls, or arrays. Pass exact large integers as decimal strings. JSON lists and objects cannot bind to Tuple and Map types. Python percent formatting and $name$ raw binary parameters are not supported. Parameter values stay out of the MCP server's normal SQL log lines, but may appear in errors and backend logs. Set CLICKHOUSE_ALLOW_WRITE_ACCESS=true to allow DDL and DML operations. Set CLICKHOUSE_ALLOW_DROP=true to additionally allow destructive operations (DROP, TRUNCATE, DELETE, UPDATE, REPLACE TABLE/PARTITION, CREATE OR REPLACE, CLEAR COLUMN/INDEX/PROJECTION, DETACH PERMANENTLY). That gate is a best-effort accident guard, not a security boundary. Integers outside [-9007199254740991, 9007199254740991] are returned as decimal strings. Two optional checks also run through this tool. Use DESCRIBE () when you need a query's output columns and types; it inspects the result schema and surfaces analysis errors such as an unknown column, but a query that describes cleanly can still fail at runtime. Consider EXPLAIN ESTIMATE before a SELECT that could be expensive; it returns the estimated parts, rows and marks read from MergeTree family tables, which is not run time and not result size. Neither runs the query body, though analysis can execute scalar subqueries.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| params | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: read-only by default, write/drop gated by environment variables, parameter binding constraints, integer handling as decimal strings, and the best-effort nature of the accident guard (not a security boundary). It even warns about parameter visibility in logs. This is exceptionally transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence delivers necessary behavioral or usage information. It's logically structured: main purpose, read-only default, parameter details, write-access gates, integer handling, and optional checks. While it could be trimmed slightly, the density of information justifies the length for a complex tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and the presence of an output schema, the description covers all essential aspects: query execution, parameter binding, access control, integer representation, and optional DESCRIBE/EXPLAIN usage. It does not need to detail the return format since an output schema exists. Nothing an agent needs to correctly invoke this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines 'query' and 'params' with no descriptions, so the description carries the entire burden. It thoroughly explains parameter binding syntax ({name:Type}), acceptable value types (scalars, nulls, arrays), limitations (no Tuple/Map binding, no Python formatting), and how to pass large integers as decimal strings. This adds critical meaning far beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it executes SQL queries in ClickHouse with a specific verb and resource. It differentiates itself from sibling tools (list_databases, list_tables) by being the general-purpose query executor, and even mentions read-only default and optional write access, making its role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use the tool for general queries, and details when to use DESCRIBE and EXPLAIN ESTIMATE for schema inspection and cost estimation. It does not explicitly say 'use list_databases for listing databases', but that's implied by sibling names and the description's scope. The read-only default and access flags also clarify permissible usage contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.7.0- Added
list_databases - Added
list_tables - Changed
run_query3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / paramsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null +} - removed
Output schema / descriptionRemoved value: -"Generic wrapper for non-object return types."
2 tool updates
v0.4.1- Removed
list_databases - Removed
list_tables
4 tool updates
v0.2.0- Changed
list_databases1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "description": "Generic wrapper for non-object return types.", + "properties": { + "result": { + "type": "string" + } + }, + "required": [ + "result" + ], + "type": "object", + "x-fastmcp-wrap-result": true +}
- Changed
list_tables5 fields changed- removed
Output schema / additionalPropertiesRemoved value: -true - added
Output schema / descriptionAdded value: +"Generic wrapper for non-object return types." - added
Output schema / propertiesAdded value: +{ + "result": { + "type": "string" + } +} - added
Output schema / requiredAdded value: +[ + "result" +] - added
Output schema / x-fastmcp-wrap-resultAdded value: +true
- Added
run_query - Removed
run_select_query
3 tool updates
v1.0.0- First observed
list_databases - First observed
list_tables - First observed
run_select_query
TDQS
Scored across 3 tools
The three tools have clearly distinct purposes: listing databases, listing tables with metadata, and executing SQL queries. There is no realistic ambiguity about which tool an agent should choose for a given operation.
All tool names follow a consistent verb_noun snake_case pattern: list_databases, list_tables, and run_query. This makes the tool surface predictable and easy to navigate.
Three tools is a compact but well-scoped set for a database MCP server: discovery of databases, discovery of tables, and execution of SQL. Each tool earns its place and there is no redundancy.
The set covers the full workflow of exploring and querying a ClickHouse instance: list databases, inspect table schemas, then run queries. Advanced operations such as EXPLAIN and DESCRIBE are accessible through run_query, with write operations config-gated, so there are no obvious dead ends.
Maintenance
Related MCP Connectors
Governed access to production AI-agent traces in an existing ClickHouse store.
Query Postgres, MySQL, SQL Server, Oracle, BigQuery, ClickHouse and Redshift from your AI client.
Browse, query, and administer your managed WaveHouse + ClickHouse projects (schema, pipes, policy).
Query 40 databases from Claude, ChatGPT, or Cursor — on any device. Read-only, encrypted, audited.
Related MCP Servers
- Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables Large Language Models to seamlessly interact with ClickHouse databases, supporting resource listing, schema retrieval, and query execution.2MIT
- AlicenseBqualityDmaintenanceAn MCP server implementation that enables Claude AI to interact with Clickhouse databases. Features include secure database connections, query execution, read-only mode support, and multi-query capabilities.22MIT
- AlicenseNot gradedqualityCmaintenanceEnables interaction with ClickHouse databases via MCP, providing tools to list databases and tables and execute safe SELECT, SHOW, and DESCRIBE queries.36 npmMIT
Appeared in Searches
- A server for finding information about ClickHouse, the open-source column-oriented database management system
- Information about ECharts - a data visualization library
- Slack - Team Communication and Collaboration Platform
- Obtaining database schema information via an MCP server
- Methods for querying and analyzing a database