77import clickhouse_connect
88from clickhouse_connect .driver .binding import format_query_value
99from dotenv import load_dotenv
10- from mcp . server . fastmcp import FastMCP
10+ from fastmcp import FastMCP
1111from dataclasses import dataclass , field , asdict , is_dataclass
1212
1313from mcp_clickhouse .mcp_env import get_config
@@ -59,14 +59,14 @@ class Table:
5959
6060load_dotenv ()
6161
62- deps = [
63- "clickhouse-connect" ,
64- "python-dotenv" ,
65- "uvicorn " ,
66- "pip-system-certs " ,
67- ]
68-
69- mcp = FastMCP ( MCP_SERVER_NAME , dependencies = deps )
62+ mcp = FastMCP (
63+ name = MCP_SERVER_NAME ,
64+ dependencies = [
65+ "clickhouse-connect " ,
66+ "python-dotenv " ,
67+ "pip-system-certs" ,
68+ ],
69+ )
7070
7171
7272def result_to_table (query_columns , result ) -> List [Table ]:
@@ -93,14 +93,19 @@ def list_databases():
9393 logger .info ("Listing all databases" )
9494 client = create_clickhouse_client ()
9595 result = client .command ("SHOW DATABASES" )
96- logger .info (f"Found { len (result ) if isinstance (result , list ) else 1 } databases" )
97- return result
96+
97+ # Convert newline-separated string to list and trim whitespace
98+ if isinstance (result , str ):
99+ databases = [db .strip () for db in result .strip ().split ("\n " )]
100+ else :
101+ databases = [result ]
102+
103+ logger .info (f"Found { len (databases )} databases" )
104+ return json .dumps (databases )
98105
99106
100107@mcp .tool ()
101- def list_tables (
102- database : str , like : Optional [str ] = None , not_like : Optional [str ] = None
103- ):
108+ def list_tables (database : str , like : Optional [str ] = None , not_like : Optional [str ] = None ):
104109 """List available ClickHouse tables in a database, including schema, comment,
105110 row count, and column count."""
106111 logger .info (f"Listing tables in database '{ database } '" )
@@ -165,9 +170,7 @@ def run_select_query(query: str):
165170 }
166171 return result
167172 except concurrent .futures .TimeoutError :
168- logger .warning (
169- f"Query timed out after { SELECT_QUERY_TIMEOUT_SECS } seconds: { query } "
170- )
173+ logger .warning (f"Query timed out after { SELECT_QUERY_TIMEOUT_SECS } seconds: { query } " )
171174 future .cancel ()
172175 # Return a properly structured response for timeout errors
173176 return {
0 commit comments