@@ -43,9 +43,6 @@ class ClickHouseConfig:
4343 CLICKHOUSE_SEND_RECEIVE_TIMEOUT: Send/receive timeout in seconds (default: 300)
4444 CLICKHOUSE_DATABASE: Default database to use (default: None)
4545 CLICKHOUSE_PROXY_PATH: Path to be added to the host URL. For instance, for servers behind an HTTP proxy (default: None)
46- CLICKHOUSE_MCP_SERVER_TRANSPORT: MCP server transport method - "stdio", "http", or "sse" (default: stdio)
47- CLICKHOUSE_MCP_BIND_HOST: Host to bind the MCP server to when using HTTP or SSE transport (default: 127.0.0.1)
48- CLICKHOUSE_MCP_BIND_PORT: Port to bind the MCP server to when using HTTP or SSE transport (default: 8000)
4946 CLICKHOUSE_ENABLED: Enable ClickHouse server (default: true)
5047 """
5148
@@ -129,39 +126,6 @@ def send_receive_timeout(self) -> int:
129126 def proxy_path (self ) -> str :
130127 return os .getenv ("CLICKHOUSE_PROXY_PATH" )
131128
132- @property
133- def mcp_server_transport (self ) -> str :
134- """Get the MCP server transport method.
135-
136- Valid options: "stdio", "http", "sse"
137- Default: "stdio"
138- """
139- transport = os .getenv ("CLICKHOUSE_MCP_SERVER_TRANSPORT" , TransportType .STDIO .value ).lower ()
140-
141- # Validate transport type
142- if transport not in TransportType .values ():
143- valid_options = ", " .join (f'"{ t } "' for t in TransportType .values ())
144- raise ValueError (f"Invalid transport '{ transport } '. Valid options: { valid_options } " )
145- return transport
146-
147- @property
148- def mcp_bind_host (self ) -> str :
149- """Get the host to bind the MCP server to.
150-
151- Only used when transport is "http" or "sse".
152- Default: "127.0.0.1"
153- """
154- return os .getenv ("CLICKHOUSE_MCP_BIND_HOST" , "127.0.0.1" )
155-
156- @property
157- def mcp_bind_port (self ) -> int :
158- """Get the port to bind the MCP server to.
159-
160- Only used when transport is "http" or "sse".
161- Default: 8000
162- """
163- return int (os .getenv ("CLICKHOUSE_MCP_BIND_PORT" , "8000" ))
164-
165129 def get_client_config (self ) -> dict :
166130 """Get the configuration dictionary for clickhouse_connect client.
167131
@@ -282,3 +246,49 @@ def get_chdb_config() -> ChDBConfig:
282246 if _CHDB_CONFIG_INSTANCE is None :
283247 _CHDB_CONFIG_INSTANCE = ChDBConfig ()
284248 return _CHDB_CONFIG_INSTANCE
249+
250+
251+ @dataclass
252+ class MCPServerConfig :
253+ """Configuration for MCP server-level settings.
254+
255+ These settings control the server transport and tool behavior and are
256+ intentionally independent of ClickHouse connection validation.
257+
258+ Optional environment variables (with defaults):
259+ CLICKHOUSE_MCP_SERVER_TRANSPORT: "stdio", "http", or "sse" (default: stdio)
260+ CLICKHOUSE_MCP_BIND_HOST: Bind host for HTTP/SSE (default: 127.0.0.1)
261+ CLICKHOUSE_MCP_BIND_PORT: Bind port for HTTP/SSE (default: 8000)
262+ CLICKHOUSE_MCP_QUERY_TIMEOUT: SELECT tool timeout in seconds (default: 30)
263+ """
264+
265+ @property
266+ def server_transport (self ) -> str :
267+ transport = os .getenv ("CLICKHOUSE_MCP_SERVER_TRANSPORT" , TransportType .STDIO .value ).lower ()
268+ if transport not in TransportType .values ():
269+ valid_options = ", " .join (f'"{ t } "' for t in TransportType .values ())
270+ raise ValueError (f"Invalid transport '{ transport } '. Valid options: { valid_options } " )
271+ return transport
272+
273+ @property
274+ def bind_host (self ) -> str :
275+ return os .getenv ("CLICKHOUSE_MCP_BIND_HOST" , "127.0.0.1" )
276+
277+ @property
278+ def bind_port (self ) -> int :
279+ return int (os .getenv ("CLICKHOUSE_MCP_BIND_PORT" , "8000" ))
280+
281+ @property
282+ def query_timeout (self ) -> int :
283+ return int (os .getenv ("CLICKHOUSE_MCP_QUERY_TIMEOUT" , "30" ))
284+
285+
286+ _MCP_CONFIG_INSTANCE = None
287+
288+
289+ def get_mcp_config () -> MCPServerConfig :
290+ """Gets the singleton instance of MCPServerConfig."""
291+ global _MCP_CONFIG_INSTANCE
292+ if _MCP_CONFIG_INSTANCE is None :
293+ _MCP_CONFIG_INSTANCE = MCPServerConfig ()
294+ return _MCP_CONFIG_INSTANCE
0 commit comments