ClickHouse
chính thứcTruy vấn máy chủ cơ sở dữ liệu ClickHouse của bạn.
Bạn có thể làm gì với ClickHouse MCP?
- Chạy truy vấn SQL — Yêu cầu thực thi bất kỳ truy vấn SQL nào trên cụm ClickHouse của bạn qua
run_query, với các tham số có tên tùy chọn thông quaparams. - Liệt kê cơ sở dữ liệu — Khám phá tất cả các cơ sở dữ liệu có sẵn trên cụm ClickHouse của bạn bằng
list_databases. - Duyệt bảng với bộ lọc — Sử dụng
list_tablesđể khám phá các bảng trong cơ sở dữ liệu, áp dụng các mẫulike/not_likevà phân trang quapage_tokenvàpage_size. - Kiểm tra lược đồ truy vấn — Yêu cầu
DESCRIBE (<query>)hoặcEXPLAIN ESTIMATE <query>quarun_queryđể kiểm tra các cột đầu ra hoặc ước tính số lần đọc trước khi thực thi. - Truy vấn dữ liệu chDB nhúng — Chạy SQL trực tiếp trên công cụ nhúng của chDB để truy vấn tệp, URL hoặc cơ sở dữ liệu mà không cần ETL, sử dụng
run_chdb_select_query.
Tài liệu
Máy chủ MCP ClickHouse
Một máy chủ MCP dành cho ClickHouse.
Máy chủ triển khai MCP 2026-07-28 và hỗ trợ bắt tay khởi tạo legacy từ
2024-11-05 đến 2025-11-25. Các máy khách hiện đại sử dụng yêu cầu không phiên và
server/discover. Các máy khách hiện có có thể tiếp tục đàm phán giao thức legacy.
[!NOTE] Các yêu cầu HTTP không có
MCP-Protocol-Versionđược định tuyến qua xử lý legacy để các máy khách từ trước2025-06-18có thể tiếp tục kết nối. MCP2026-07-28cho phép hành vi này trên các máy chủ hỗ trợ các máy khách đó. Các máy khách hiện đại nên gửi tiêu đề trong mọi yêu cầu POST.
Tính năng
Công cụ ClickHouse
Phản hồi của công cụ ClickHouse là các chuỗi mã hóa JSON. Các số nguyên nằm ngoài
[-9007199254740991, 9007199254740991] được trả về dưới dạng chuỗi thập phân để giữ nguyên giá trị chính xác
trong các máy khách JavaScript. Điều này áp dụng cho các hàng truy vấn và siêu dữ liệu bảng số nguyên. Các số nguyên
trong phạm vi an toàn và giá trị boolean giữ nguyên kiểu JSON của chúng.
-
run_query- Thực thi truy vấn SQL trên cụm ClickHouse của bạn.
- Đầu vào:
query(chuỗi): Truy vấn SQL cần thực thi. - Đầu vào tùy chọn:
params(đối tượng): Các giá trị có tên cho các trình giữ chỗ{name:Type}của ClickHouse. Xem Tham số truy vấn. - Truy vấn chạy ở chế độ chỉ đọc theo mặc định (
CLICKHOUSE_ALLOW_WRITE_ACCESS=false), nhưng có thể bật ghi một cách tường minh nếu cần. DESCRIBE (<query>)vàEXPLAIN ESTIMATE <query>cũng chạy ở đây và là các cách tùy chọn để kiểm tra lược đồ kết quả của truy vấn hoặc số lần đọc ước tính của nó. Xem Kiểm tra truy vấn trước khi chạy.
-
list_databases- Liệt kê tất cả cơ sở dữ liệu trên cụm ClickHouse của bạn.
-
list_tables- Liệt kê các bảng trong cơ sở dữ liệu với phân trang.
- Đầu vào bắt buộc:
database(chuỗi). - Đầu vào tùy chọn:
like/not_like(chuỗi): Áp dụng bộ lọcLIKEhoặcNOT LIKEcho tên bảng.page_token(chuỗi): Mã thông báo dùng một lần được trả về từ lệnh gọi trước. Mã này được giữ tối đa một giờ.page_size(int, mặc định50): Số bảng được trả về mỗi trang; phải lớn hơn0.include_detailed_columns(bool, mặc địnhtrue): Khifalse, bỏ qua siêu dữ liệu cột để có phản hồi nhẹ hơn trong khi vẫn giữ đầy đủcreate_table_query.
- Hình dạng phản hồi:
tables: Mảng các đối tượng bảng cho trang hiện tại.next_page_token: Truyền giá trị dùng một lần này trước khi hết hạn để lấy trang tiếp theo, hoặcnullkhi không còn bảng nào.total_tables: Tổng số bảng khớp với các bộ lọc được cung cấp.
Khám phá lược đồ Agents
Các hướng dẫn của máy chủ đề xuất đọc Agents Schema's
canonical AGENTS.ROOT qua run_query khi list_databases tiết lộ một cơ sở dữ liệu AGENTS,
trước khi viết SQL phân tích. Đây là hướng dẫn cho agent: không có siêu dữ liệu
nào được tìm nạp tự động, kết quả công cụ không thay đổi và các quyền ClickHouse hiện có
vẫn được áp dụng. Nếu AGENTS.ROOT bị thiếu hoặc không thể truy cập, việc khám phá
và truy vấn thông thường vẫn khả dụng.
Tham số truy vấn
Truyền các giá trị riêng biệt với SQL qua đối tượng params tùy chọn:
{
"query": "SELECT {id:UInt32} AS id, {name:String} AS name",
"params": {"id": 13, "name": "O'Reilly"}
}
Sử dụng các trình giữ chỗ {name:Type} của ClickHouse mà không cần đặt trong dấu ngoặc kép. Giữ dấu ngoặc nhọn mở,
tên và dấu hai chấm liền kề, như trong {id:UInt32}. Khoảng trắng sau dấu hai chấm và
trong kiểu được hỗ trợ, như trong {id: UInt32} và {amount:Decimal(18, 4)}.
Để tương thích với các phiên bản trình điều khiển được hỗ trợ, hãy bắt đầu tên bằng chữ cái hoặc
dấu gạch dưới và chỉ sử dụng chữ cái, chữ số và dấu gạch dưới.
Định dạng kiểu Python %s hoặc %(name)s và tham số nhị phân thô $name$ của trình điều khiển
không được hỗ trợ. Các lệnh gọi chỉ có query vẫn hoạt động. Bỏ qua params,
truyền null hoặc truyền một đối tượng trống sẽ để truy vấn không được ràng buộc.
Các giá trị tham số có thể là chuỗi JSON, số, boolean, null hoặc mảng, miễn là
chúng khớp với kiểu ClickHouse đã khai báo:
- Sử dụng
nullvới kiểuNullable(...). - Truyền các số nguyên chính xác ngoài phạm vi an toàn của JavaScript dưới dạng chuỗi thập phân, ví dụ
"18446744073709551615"với{id:UInt64}. Ngày, dấu thời gian và số thập phân chính xác cũng có thể được truyền dưới dạng chuỗi với kiểu ClickHouse tương ứng. - Ràng buộc vectơ dưới dạng một mảng, ví dụ
{vector:Array(Float32)}với"params": {"vector": [0.25, 0.5, 0.75]}. - Null bên trong mảng phụ thuộc vào trình điều khiển đã cài đặt. Chúng hoạt động với clickhouse-connect 1.8.0 nhưng không hoạt động với phiên bản tối thiểu được hỗ trợ 1.0.0.
- Danh sách và đối tượng JSON không thể ràng buộc với các kiểu
TuplevàMapcủa ClickHouse.
Các giá trị bị thiếu và kiểu không tương thích trả về lỗi truy vấn. Với params không trống,
một truy vấn mang nhiều điểm bắt đầu trình giữ chỗ {name: chưa kết thúc sẽ bị từ chối, bao gồm cả văn bản giống trình giữ chỗ
trong chú thích hoặc chuỗi ký tự.
Các truy vấn có tham số sử dụng cùng bảo vệ ghi, thời gian chờ, hủy bỏ và
mã hóa kết quả JSON như các truy vấn khác.
Các giá trị tham số nằm ngoài các thông báo nhật ký SQL thông thường của máy chủ MCP, nhưng vẫn
nằm trong các đối số công cụ MCP và có thể xuất hiện trong lỗi phụ trợ. ClickHouse 26.3.20.7
thay thế các giá trị vào văn bản truy vấn trong system.query_log, system.processes,
và system.text_log. Ràng buộc tham số không phải là tính năng bảo mật và không
giảm số lượng giá trị vectơ được gửi trong một lệnh gọi công cụ.
Kiểm tra truy vấn trước khi chạy
run_query cũng chạy DESCRIBE và EXPLAIN ESTIMATE. Cả hai đều là kiểm tra tùy chọn: sử dụng DESCRIBE khi bạn cần các cột và kiểu đầu ra của truy vấn, và sử dụng EXPLAIN ESTIMATE trước một SELECT có thể tốn kém.
DESCRIBE (<query>) kiểm tra lược đồ kết quả và trả về cùng siêu dữ liệu cột đầu ra như DESCRIBE TABLE:
DESCRIBE (SELECT user, sum(amt) FROM events WHERE ts > now() - INTERVAL 30 DAY GROUP BY user)
user String
sum(amt) Decimal(38, 2)
ClickHouse phải phân tích truy vấn để trả lời, vì vậy lỗi phân tích xuất hiện ở đây, với thông báo của chính ClickHouse, thay vì giữa chừng khi thực thi:
DESCRIBE (SELECT usr FROM events) -> Code: 47. Unknown expression identifier `usr` ... Maybe you meant: ['user']
DESCRIBE (SELECT * FROM nosuch) -> Code: 60. Unknown table expression identifier 'nosuch'
Một truy vấn mô tả sạch sẽ vẫn có thể thất bại khi chạy, do giới hạn bộ nhớ hoặc lỗi máy chủ từ xa, và nó không nói gì về chi phí.
EXPLAIN ESTIMATE <query> trả về các phần, hàng và dấu mà truy vấn sẽ đọc, một hàng cho mỗi bảng, điều này phân biệt tra cứu khóa chính với quét toàn bộ:
EXPLAIN ESTIMATE SELECT count() FROM events WHERE id = 42
database table parts rows marks
default events 1 8192 1
Đó là các lần đọc ước tính từ các bảng họ MergeTree, sau khi cắt tỉa khóa chính và phân vùng. Chúng không phải là thời gian chạy và không phải là kích thước kết quả, và các công cụ bảng khác không được bao phủ.
Không câu lệnh nào chạy phần thân truy vấn, nhưng phân tích không phải lúc nào cũng miễn phí: DESCRIBE (SELECT (SELECT sleep(1))) thực thi truy vấn con vô hướng trong khi phân tích. Cả hai đều chỉ đọc và hoạt động dưới CLICKHOUSE_ALLOW_WRITE_ACCESS=false mặc định. Xem tài liệu ClickHouse cho EXPLAIN ESTIMATE và DESCRIBE.
Công cụ chDB
run_chdb_select_query- Thực thi truy vấn SQL bằng công cụ ClickHouse nhúng của chDB.
- Đầu vào:
query(chuỗi): Truy vấn SQL cần thực thi. - Các số nguyên ngoài
[-9007199254740991, 9007199254740991]được trả về dưới dạng chuỗi thập phân. - Truy vấn dữ liệu trực tiếp từ nhiều nguồn khác nhau (tệp, URL, cơ sở dữ liệu) mà không cần quy trình ETL.
- Yêu cầu gói bổ sung tùy chọn
chdb:pip install 'mcp-clickhouse[chdb]'
Điểm cuối kiểm tra sức khỏe
Khi chạy với truyền tải HTTP hoặc SSE, một điểm cuối kiểm tra sức khỏe có sẵn tại /health. Điểm cuối này:
- Trả về
200 OK(nội dung:OK) nếu máy chủ khỏe mạnh và có thể kết nối với ClickHouse - Trả về
503 Service Unavailablevới thông báo lỗi chung nếu máy chủ không thể kết nối với ClickHouse - Trả về
503nếu một lần dò ClickHouse không hoàn thành trong vòng hai giây. Các yêu cầu đồng thời chia sẻ một lần dò đang chạy - Tái sử dụng kết quả dò đã hoàn thành trong một giây, vì vậy các lần dò đến liên tiếp không mỗi lần kết nối với ClickHouse. Do đó, một lỗi hoặc phục hồi có thể được báo cáo muộn tối đa một giây
Các yêu cầu GET và HEAD đến điểm cuối cố ý không xác thực và được miễn xác thực Host và Origin để các lần dò của bộ điều phối (ví dụ: Kubernetes liveness/readiness, bộ cân bằng tải) có thể sử dụng IP pod hoặc IP mục tiêu được gán trong thời gian chạy mà không cần cấu hình thêm. /health được dành riêng và không thể được sử dụng làm đường dẫn truyền tải MCP. Nội dung phản hồi cố ý tối thiểu để tránh rò rỉ chuỗi phiên bản phụ trợ hoặc chi tiết lỗi; gỡ lỗi lỗi qua nhật ký máy chủ.
Ví dụ:
curl http://localhost:8000/health
# Response: OK
Bảo mật
Xác thực cho truyền tải HTTP/SSE
Khi sử dụng truyền tải HTTP hoặc SSE, xác thực bắt buộc theo mặc định. Truyền tải stdio (mặc định) không yêu cầu xác thực vì nó chỉ giao tiếp qua đầu vào/đầu ra tiêu chuẩn.
Ba chế độ xác thực được hỗ trợ. Chọn một:
| Chế độ | Khi nào sử dụng | Biến môi trường |
|---|---|---|
| Mã thông báo bearer tĩnh | Triển khai đơn giản, dịch vụ nội bộ | CLICKHOUSE_MCP_AUTH_TOKEN |
| OAuth / OIDC (qua FastMCP) | Azure Entra, Google, GitHub, WorkOS, v.v. | FASTMCP_SERVER_AUTH=<provider-class-path> (+ biến FASTMCP_SERVER_AUTH_* dành riêng cho nhà cung cấp) |
| Đã tắt | Chỉ phát triển cục bộ | CLICKHOUSE_MCP_AUTH_DISABLED=true |
Khởi động thất bại nếu không có chế độ nào trong số này được cấu hình cho truyền tải HTTP/SSE.
Thiết lập xác thực
-
Tạo một mã thông báo an toàn (có thể là bất kỳ chuỗi ngẫu nhiên nào):
# Using uuidgen (macOS/Linux) uuidgen # Using openssl openssl rand -hex 32 -
Cấu hình máy chủ với mã thông báo:
export CLICKHOUSE_MCP_AUTH_TOKEN="your-generated-token" -
Cấu hình máy khách MCP của bạn để bao gồm mã thông báo trong các yêu cầu:
Đối với Claude Desktop với truyền tải HTTP/SSE:
{ "mcpServers": { "mcp-clickhouse": { "url": "http://127.0.0.1:8000", "headers": { "Authorization": "Bearer your-generated-token" } } } }Lưu ý: điểm cuối
/healthcố ý không xác thực (xem Điểm cuối kiểm tra sức khỏe ở trên). Để xác minh rằng xác thực bearer-token thực sự từ chối các yêu cầu không xác thực, hãy truy cập chính điểm cuối MCP, ví dụ với MCP Inspector, hoặc bằng cách POST một yêu cầu JSON-RPC đến/mcpcó và không có tiêu đềAuthorizationvà xác nhận lệnh gọi không xác thực trả về401.
OAuth / OIDC qua FastMCP
Đối với các triển khai sản xuất với nhà cung cấp danh tính (Azure Entra, Google, GitHub, WorkOS, v.v.), hãy ủy quyền xác thực cho các nhà cung cấp xác thực tích hợp của FastMCP thay vì sử dụng mã thông báo tĩnh. Đặt FASTMCP_SERVER_AUTH thành đường dẫn lớp đầy đủ của một nhà cung cấp xác thực FastMCP, cùng với các biến FASTMCP_SERVER_AUTH_* dành riêng cho nhà cung cấp và để CLICKHOUSE_MCP_AUTH_TOKEN không được đặt.
Ví dụ (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>"
export FASTMCP_SERVER_AUTH_AZURE_BASE_URL="https://mcp.example.com"
export FASTMCP_SERVER_AUTH_AZURE_REQUIRED_SCOPES="read access_as_user"
mcp-clickhouse giữ lại các tiền tố môi trường FastMCP 2.14.7 này cho các nhà cung cấp tích hợp FastMCP 4.0.0:
| Đường dẫn lớp nhà cung cấp | Tiền tố biến nhà cung cấp |
|---|---|
fastmcp.server.auth.providers.auth0.Auth0Provider | FASTMCP_SERVER_AUTH_AUTH0_ |
fastmcp.server.auth.providers.aws.AWSCognitoProvider | FASTMCP_SERVER_AUTH_AWS_COGNITO_ |
fastmcp.server.auth.providers.azure.AzureProvider | FASTMCP_SERVER_AUTH_AZURE_ |
fastmcp.server.auth.providers.descope.DescopeProvider | FASTMCP_SERVER_AUTH_DESCOPEPROVIDER_ |
fastmcp.server.auth.providers.discord.DiscordProvider | FASTMCP_SERVER_AUTH_DISCORD_ |
fastmcp.server.auth.providers.github.GitHubProvider | FASTMCP_SERVER_AUTH_GITHUB_ |
fastmcp.server.auth.providers.google.GoogleProvider | FASTMCP_SERVER_AUTH_GOOGLE_ |
fastmcp.server.auth.providers.introspection.IntrospectionTokenVerifier | FASTMCP_SERVER_AUTH_INTROSPECTION_ |
fastmcp.server.auth.providers.jwt.JWTVerifier | FASTMCP_SERVER_AUTH_JWT_ |
fastmcp.server.auth.providers.oci.OCIProvider | FASTMCP_SERVER_AUTH_OCI_ |
fastmcp.server.auth.providers.scalekit.ScalekitProvider | FASTMCP_SERVER_AUTH_SCALEKITPROVIDER_ |
fastmcp.server.auth.providers.supabase.SupabaseProvider | FASTMCP_SERVER_AUTH_SUPABASE_ |
fastmcp.server.auth.providers.workos.WorkOSProvider | FASTMCP_SERVER_AUTH_WORKOS_ |
fastmcp.server.auth.providers.workos.AuthKitProvider | FASTMCP_SERVER_AUTH_AUTHKITPROVIDER_ |
Thêm tên trường nhà cung cấp viết hoa vào tiền tố. Xem tài liệu FastMCP cho các yêu cầu cấu hình của từng nhà cung cấp.
Các giá trị xác thực được đặt trực tiếp trong môi trường tiến trình có mức ưu tiên cao hơn, không phân biệt chữ hoa chữ thường.
Việc tải .env mặc định bắt đầu từ thư mục gói mcp_clickhouse đã cài đặt,
giải quyết các liên kết tượng trưng trước tiên và đi lên đến gốc hệ thống tệp. Nó tải tệp
.env đầu tiên tìm thấy và không tải gì nếu không có tệp nào. Nó không bao giờ đọc thư mục
làm việc, bất kể máy chủ được khởi chạy như thế nào. Một bản kiểm tra mã nguồn thường tìm thấy
.env tại gốc kho lưu trữ. Tệp đó cũng có thể cung cấp FASTMCP_SERVER_AUTH và các
trường nhà cung cấp của nó. Các giá trị của nó có mức ưu tiên cao hơn tệp xác thực tường minh hoặc tương thích.
Để tương thích với FastMCP 2, mcp-clickhouse đọc các trường nhà cung cấp còn thiếu từ .env
trong thư mục làm việc, nhưng phương án dự phòng tương thích đó không thể chọn
FASTMCP_SERVER_AUTH. Một FASTMCP_ENV_FILE được đặt trong tiến trình thay thế phương án dự phòng
tương thích đó và có thể cung cấp cả trường bộ chọn và nhà cung cấp. Đặt nó trước khi khởi động.
Trình tải tương thích mcp-clickhouse chỉ đọc FASTMCP_SERVER_AUTH và
FASTMCP_SERVER_AUTH_* từ tệp đó, vì vậy nó không thể chèn cài đặt CLICKHOUSE_*.
FastMCP 4 có thể sử dụng cùng một tệp cho các cài đặt rộng hơn của riêng nó. Một nhà cung cấp tùy chỉnh không nhận
đối số hàm tạo có nguồn gốc từ môi trường và phải hỗ trợ cấu trúc không có đối số.
Coi cả tệp .env được phát hiện và trong thư mục làm việc là cấu hình xác thực
đáng tin cậy. Bất kỳ ai có thể tạo hoặc ghi một .env trong bất kỳ thư mục nào từ thư mục gói
lên đến gốc hệ thống tệp đều có thể kiểm soát tệp nào được phát hiện, chọn nhà cung cấp
và đặt các trường của nó. Bất kỳ ai có thể ghi tệp trong thư mục làm việc đều kiểm soát mọi trường nhà cung cấp
không có trong tiến trình và cấu hình được phát hiện, bao gồm khóa ký,
nhà phát hành và điểm cuối, cũng như bí mật máy khách. Một FASTMCP_ENV_FILE được đặt trong tiến trình trỏ
đến một tệp thuộc sở hữu của nhà điều hành sẽ vô hiệu hóa phương án dự phòng thư mục làm việc.
FastMCP 4 đã thay đổi kho lưu trữ máy khách proxy OAuth mặc định. Các triển khai dựa trên lưu trữ proxy OAuth mặc định của FastMCP 2 phải đăng ký và ủy quyền lại cho máy khách. Lưu trữ tùy chỉnh tương thích, mã thông báo bearer tĩnh và xác minh JWT không bị ảnh hưởng.
Chế độ Phát triển (Vô hiệu hóa Xác thực)
Chỉ dành cho phát triển và thử nghiệm cục bộ, bạn có thể vô hiệu hóa xác thực bằng cách đặt:
export CLICKHOUSE_MCP_AUTH_DISABLED=true
export CLICKHOUSE_MCP_ALLOWED_HOSTS=127.0.0.1:8000,localhost:8000
CẢNH BÁO: Chỉ sử dụng điều này cho phát triển cục bộ. Không vô hiệu hóa xác thực khi máy chủ được tiếp xúc với bất kỳ mạng nào.
Cấu hình
Máy chủ MCP này hỗ trợ cả ClickHouse và chDB. Bạn có thể bật một trong hai hoặc cả hai tùy theo nhu cầu. Python 3.10 đến 3.14 được hỗ trợ. Python 3.12 được khuyến nghị cho các lần khởi chạy cục bộ.
-
Mở tệp cấu hình Claude Desktop nằm tại:
- Trên macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Trên Windows:
%APPDATA%/Claude/claude_desktop_config.json
- Trên macOS:
-
Thêm nội dung sau:
{
"mcpServers": {
"mcp-clickhouse": {
"command": "uv",
"args": [
"run",
"--with",
"mcp-clickhouse",
"--python",
"3.12",
"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"
}
}
}
}
Cập nhật các biến môi trường để trỏ đến dịch vụ ClickHouse của riêng bạn.
Hoặc, nếu bạn muốn dùng thử với ClickHouse SQL Playground, bạn có thể sử dụng cấu hình sau:
{
"mcpServers": {
"mcp-clickhouse": {
"command": "uv",
"args": [
"run",
"--with",
"mcp-clickhouse",
"--python",
"3.12",
"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"
}
}
}
}
Đối với chDB (công cụ ClickHouse nhúng), thêm cấu hình sau:
{
"mcpServers": {
"mcp-clickhouse": {
"command": "uv",
"args": [
"run",
"--with",
"mcp-clickhouse[chdb]",
"--python",
"3.12",
"mcp-clickhouse"
],
"env": {
"CHDB_ENABLED": "true",
"CLICKHOUSE_ENABLED": "false",
"CHDB_DATA_PATH": "/path/to/chdb/data"
}
}
}
}
Bạn cũng có thể bật đồng thời cả ClickHouse và chDB:
{
"mcpServers": {
"mcp-clickhouse": {
"command": "uv",
"args": [
"run",
"--with",
"mcp-clickhouse[chdb]",
"--python",
"3.12",
"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",
"CHDB_ENABLED": "true",
"CHDB_DATA_PATH": "/path/to/chdb/data"
}
}
}
}
-
Xác định mục nhập lệnh cho
uvvà thay thế nó bằng đường dẫn tuyệt đối đến tệp thực thiuv. Điều này đảm bảo rằng phiên bản chính xác củauvđược sử dụng khi khởi động máy chủ. Trên máy Mac, bạn có thể tìm đường dẫn này bằngwhich uv. -
Khởi động lại Claude Desktop để áp dụng các thay đổi.
Quyền Ghi Tùy chọn
Theo mặc định, MCP này thực thi các truy vấn chỉ đọc để các thay đổi vô tình không thể xảy ra trong quá trình khám phá. Để cho phép câu lệnh DDL hoặc INSERT, đặt biến môi trường CLICKHOUSE_ALLOW_WRITE_ACCESS thành true. Máy chủ vẫn tiếp tục thực thi chế độ chỉ đọc nếu phiên bản ClickHouse tự nó không cho phép ghi.
Chế độ chỉ đọc vẫn cho phép người dùng ClickHouse hủy các truy vấn của chính họ, bao gồm cả các truy vấn từ các kết nối khác sử dụng cùng người dùng. Sử dụng người dùng ClickHouse chuyên dụng ngay cả trong chế độ chỉ đọc. Sử dụng các người dùng ClickHouse riêng biệt cho các khối lượng công việc không được phép hủy truy vấn của nhau.
Bảo vệ Thao tác Phá hủy
Ngay cả khi quyền ghi được bật (CLICKHOUSE_ALLOW_WRITE_ACCESS=true), các thao tác phá hủy yêu cầu cờ chọn tham gia bổ sung để đảm bảo an toàn. Kiểm tra bao gồm bất kỳ câu lệnh DROP nào (bao gồm cả mệnh đề ALTER TABLE ... DROP PARTITION / DROP PART / DROP COLUMN), bất kỳ TRUNCATE, DELETE và UPDATE nào (cả câu lệnh nhẹ và biến đổi ALTER TABLE ... DELETE / ALTER TABLE ... UPDATE), REPLACE TABLE, CREATE OR REPLACE, ALTER TABLE ... REPLACE PARTITION, ALTER TABLE ... CLEAR COLUMN / CLEAR INDEX / CLEAR PROJECTION, và DETACH ... PERMANENTLY. Các từ khóa bên trong chuỗi ký tự, định danh được trích dẫn, chú thích SQL và tên tham số {name:Type} bị bỏ qua, vì vậy chúng không kích hoạt kiểm tra cũng như không che giấu câu lệnh khỏi kiểm tra.
Kiểm tra này chạy trong máy chủ MCP và là biện pháp bảo vệ tốt nhất chống lại tai nạn. Nó không phải là ranh giới bảo mật. Ranh giới bảo mật là các quyền được cấp của người dùng ClickHouse. Chế độ chỉ đọc (mặc định) được thực thi phía máy chủ qua readonly=1. Cổng thao tác phá hủy không được thực thi phía máy chủ.
Đối với chế độ ghi, cấp cho máy chủ MCP một người dùng ClickHouse chuyên dụng chỉ với các quyền cần thiết:
CREATE USER mcp_agent IDENTIFIED BY '...';
GRANT SELECT, INSERT, CREATE TABLE, ALTER ADD COLUMN ON mydb.* TO mcp_agent;
Các thao tác thay đổi dữ liệu yêu cầu quyền ngoài các quyền được cấp này sẽ thất bại phía máy chủ với ACCESS_DENIED, bất kể cờ MCP. Cài đặt máy chủ max_table_size_to_drop và max_partition_size_to_drop cũng có thể giới hạn phạm vi ảnh hưởng nếu được ghim với các ràng buộc cài đặt.
Để bật các thao tác phá hủy, đặt cả hai cờ:
"env": {
"CLICKHOUSE_ALLOW_WRITE_ACCESS": "true",
"CLICKHOUSE_ALLOW_DROP": "true"
}
Phương pháp hai tầng này làm cho việc xóa vô tình trở nên khó khăn:
- Thao tác ghi (INSERT, CREATE, ALTER ADD COLUMN) yêu cầu
CLICKHOUSE_ALLOW_WRITE_ACCESS=true - Thao tác phá hủy (DROP, TRUNCATE, DELETE, UPDATE và phần còn lại của danh sách trên) bổ sung yêu cầu
CLICKHOUSE_ALLOW_DROP=true
Chạy Không Có uv (Sử dụng Python Hệ thống)
Nếu bạn muốn sử dụng cài đặt Python hệ thống thay vì uv, bạn có thể cài đặt gói từ PyPI và chạy trực tiếp:
-
Cài đặt gói bằng pip:
python3 -m pip install mcp-clickhouseĐể cài đặt hỗ trợ chDB:
python3 -m pip install 'mcp-clickhouse[chdb]'Để nâng cấp lên phiên bản mới nhất:
python3 -m pip install --upgrade mcp-clickhouse -
Cập nhật cấu hình Claude Desktop của bạn để sử dụng Python trực tiếp:
{
"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"
}
}
}
}
Ngoài ra, bạn có thể sử dụng tập lệnh đã cài đặt trực tiếp:
{
"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"
}
}
}
}
Lưu ý: Đảm bảo sử dụng đường dẫn đầy đủ đến tệp thực thi Python hoặc tập lệnh mcp-clickhouse nếu chúng không nằm trong PATH hệ thống của bạn. Bạn có thể tìm đường dẫn bằng:
which python3cho tệp thực thi Pythonwhich mcp-clickhousecho tập lệnh đã cài đặt
Middleware Tùy chỉnh
Bạn có thể thêm middleware tùy chỉnh vào máy chủ MCP mà không cần sửa đổi mã nguồn. FastMCP cung cấp hệ thống middleware cho phép bạn chặn và xử lý các thông điệp giao thức MCP (gọi công cụ, đọc tài nguyên, lời nhắc, v.v.).
Cách Sử dụng
- Tạo một mô-đun Python với các lớp middleware mở rộng
Middlewarevà một hàmsetup_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())
- Đặt biến môi trường
MCP_MIDDLEWARE_MODULEthành tên mô-đun (không có phần mở rộng.py):
{
"mcpServers": {
"mcp-clickhouse": {
"command": "uv",
"args": ["run", "--with", "mcp-clickhouse", "--python", "3.12", "mcp-clickhouse"],
"env": {
"CLICKHOUSE_HOST": "<clickhouse-host>",
"CLICKHOUSE_USER": "<clickhouse-user>",
"CLICKHOUSE_PASSWORD": "<clickhouse-password>",
"MCP_MIDDLEWARE_MODULE": "my_middleware"
}
}
}
}
- Đảm bảo mô-đun middleware của bạn nằm trong đường dẫn nhập của Python (ví dụ: trong cùng thư mục nơi máy chủ MCP chạy hoặc được cài đặt dưới dạng gói).
Ví dụ Middleware
Một mô-đun middleware ví dụ được cung cấp trong example_middleware.py hiển thị các mẫu phổ biến:
- Ghi nhật ký tất cả yêu cầu MCP
- Ghi nhật ký các lệnh gọi công cụ cụ thể
- Đo thời gian xử lý yêu cầu
Để sử dụng ví dụ:
"env": {
"MCP_MIDDLEWARE_MODULE": "example_middleware"
}
Khả năng Middleware
Lớp cơ sở Middleware cung cấp các hook cho các thao tác MCP khác nhau:
on_message(context, call_next)- Được gọi cho tất cả thông điệpon_request(context, call_next)- Được gọi cho tất cả yêu cầuon_notification(context, call_next)- Được gọi cho tất cả thông báoon_call_tool(context, call_next)- Được gọi khi một công cụ được thực thion_read_resource(context, call_next)- Được gọi khi một tài nguyên được đọcon_get_prompt(context, call_next)- Được gọi khi một lời nhắc được truy xuấton_list_tools(context, call_next)- Được gọi khi liệt kê công cụon_list_resources(context, call_next)- Được gọi khi liệt kê tài nguyênon_list_resource_templates(context, call_next)- Được gọi khi liệt kê mẫu tài nguyênon_list_prompts(context, call_next)- Được gọi khi liệt kê lời nhắc
Mỗi hook nhận một đối tượng MiddlewareContext chứa thông điệp và siêu dữ liệu, cùng một hàm call_next để tiếp tục đường ống.
Cấu hình Máy khách Động qua Trạng thái Ngữ cảnh
Middleware có thể ghi đè cấu hình máy khách ClickHouse trên cơ sở từng yêu cầu bằng khóa trạng thái ngữ cảnh CLIENT_CONFIG_OVERRIDES_KEY. Máy chủ hợp nhất các ghi đè này với cấu hình cơ sở từ các biến môi trường.
from fastmcp.server.dependencies import get_context
from fastmcp.server.middleware import CallNext, Middleware, MiddlewareContext
from mcp_clickhouse.mcp_server import CLIENT_CONFIG_OVERRIDES_KEY
class ClientConfigMiddleware(Middleware):
async def on_call_tool(self, context: MiddlewareContext, call_next: CallNext):
ctx = get_context()
await ctx.set_state(
CLIENT_CONFIG_OVERRIDES_KEY,
{
"connect_timeout": 60,
"send_receive_timeout": 120,
},
serializable=False,
)
return await call_next(context)
Điều này cho phép các trường hợp sử dụng nâng cao như điều chỉnh thời gian chờ động, định tuyến theo đối tượng thuê hoặc cài đặt kết nối theo từng người dùng.
Giá trị trạng thái phải là một từ điển. Các giá trị settings và generic_args lồng nhau phải là
ánh xạ và được hợp nhất với cấu hình cơ sở. Các giá trị không hợp lệ làm cho lệnh gọi công cụ thất bại trước khi
máy khách ClickHouse được tạo. CLICKHOUSE_ROLE vẫn hoạt động trừ khi ghi đè cung cấp rõ ràng
settings.role. Các khóa cấp cao nhất role và ch_role, cùng các khóa tương tự dưới
generic_args, bị từ chối.
Đặt verify, ca_cert, client_cert, client_cert_key, tls_mode, server_host_name,
và pool_mgr chỉ dưới dạng ghi đè cấp cao nhất. Chúng không thể được lồng dưới generic_args. Một
pool_mgr tùy chỉnh không thể được kết hợp với cài đặt CA được quản lý hoặc chứng chỉ máy khách. Tham số truy vấn DSN
không thể đặt các khóa này và DSN không thể chọn backend chdb. Sử dụng các ghi đè cấp cao nhất tường minh
host, port, username, password, database và secure để thay đổi
kết nối. Một DSN được chuyển tiếp không thay thế các trường kết nối cơ sở đã được điền hoặc chọn
TLS. Nó có thể điền các trường trống và cung cấp các tham số truy vấn được hỗ trợ như query_limit.
Các ghi đè secure và verify chấp nhận boolean hoặc chuỗi true và false.
verify cũng chấp nhận proxy, hoạt động như
tls_mode: proxy khi tls_mode không được đặt và do đó sử dụng xác thực Basic với
mật khẩu môi trường. Một ghi đè secure chọn giao diện https hoặc http khớp và
không thay đổi cổng. Một ghi đè interface tường minh phải là http hoặc https và khớp
với secure. Sau khi hợp nhất các ghi đè, các chế độ chứng chỉ máy khách mặc định và mutual bỏ qua
mật khẩu. Các chế độ proxy và strict sử dụng xác thực Basic với mật khẩu môi trường
trừ khi ghi đè cung cấp thông tin xác thực của riêng nó.
Coi các ghi đè này là đầu vào middleware đáng tin cậy. Middleware phải xác thực và ủy quyền
các giá trị có nguồn gốc từ yêu cầu trước khi đặt chúng. Sử dụng serializable=False để FastMCP giữ
giá trị trong trạng thái cục bộ yêu cầu. serializable=True mặc định lưu trữ trạng thái phiên và bị
máy chủ từ chối. Máy chủ chụp nhanh giá trị trước khi phân phối công việc cơ sở dữ liệu chặn.
Không lưu trữ dữ liệu đối tượng thuê trong trạng thái Ngữ cảnh có phạm vi phiên. Một ghi đè có phạm vi phiên bị từ chối
vẫn được gắn vào phiên MCP kế thừa và khiến các lệnh gọi công cụ sau đó trong phiên đó
thất bại cho đến khi máy khách kết nối lại. Một vai trò ClickHouse theo yêu cầu là cấu hình kết nối,
không phải ranh giới ủy quyền đối tượng thuê. Thực thi cô lập đối tượng thuê bằng người dùng ClickHouse, vai trò
và quyền được cấp.
Phát triển
-
Trong thư mục
test-serviceschạydocker compose up -dđể khởi động cụm ClickHouse. -
Thêm các biến sau vào tệp
.envở gốc kho lưu trữ.
Lưu ý: Việc sử dụng người dùng default trong ngữ cảnh này chỉ nhằm mục đích phát triển cục bộ.
CLICKHOUSE_HOST=localhost
CLICKHOUSE_PORT=8123
CLICKHOUSE_USER=default
CLICKHOUSE_PASSWORD=clickhouse
-
Chạy
uv syncđể cài đặt các phụ thuộc. Để cài đặtuv, hãy làm theo hướng dẫn tại đây. Sau đó thực hiệnsource .venv/bin/activate. -
Để kiểm tra dễ dàng với MCP Inspector, chạy
uv run fastmcp dev inspector mcp_clickhouse/mcp_server.py:mcpđể khởi động máy chủ MCP. -
Để kiểm tra với giao thức HTTP và điểm kiểm tra sức khỏe:
# 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
Cấu trúc mã nguồn
Gói sử dụng cấu trúc mô-đun phẳng. Bắt đầu với mcp_server.py để lắp ráp và đăng ký máy chủ, sau đó theo dõi quá trình triển khai vào mô-đun sở hữu của nó.
| Mô-đun | Trách nhiệm |
|---|---|
| mcp_server.py, main.py | Lắp ráp khởi động, đăng ký công cụ và lời nhắc, điều phối tắt máy và khởi động CLI |
| clients.py | Cấu hình yêu cầu, kết nối ClickHouse được lưu trong bộ nhớ đệm và hợp đồng thuê máy khách |
| queries.py | Thực thi truy vấn, hủy bỏ và bảo vệ các thao tác phá hủy |
| metadata.py | Khám phá cơ sở dữ liệu và bảng, mô hình siêu dữ liệu và phân trang |
| chdb_backend.py, chdb_prompt.py | Khởi tạo chDB tùy chọn, thực thi truy vấn và nội dung lời nhắc |
| health.py, executors.py | Kiểm tra sức khỏe và bộ nhớ đệm, cùng các nhóm công nhân được sử dụng bởi các thao tác máy chủ |
| auth.py, transport.py, http_security.py | Tải dotenv, xác thực, xây dựng ứng dụng HTTP/SSE và xác thực Host/Origin |
| mcp_env.py, serialization.py | Cấu hình môi trường và mã hóa kết quả JSON |
| mcp_middleware_hook.py, skills_advisor.py | Tải middleware tùy chỉnh và hướng dẫn máy chủ |
Mỗi bộ lắp ráp máy chủ sở hữu các nhóm công nhân, bộ nhớ đệm máy khách, truy vấn đang hoạt động, bộ nhớ đệm phân trang, trạng thái sức khỏe và backend chDB. Việc dọn dẹp công nhân và máy khách chạy khi thoát tiến trình. Việc nhập gói khởi tạo máy chủ mặc định, bao gồm cả khi nhập mô-đun được trích xuất lần đầu.
Trong các bài kiểm tra, hãy vá mô-đun hoặc phiên bản sở hữu nơi mã đọc phụ thuộc. Ví dụ,
vá mcp_clickhouse.clients.clickhouse_connect.get_client để tạo máy khách. Việc nhập tương thích
trong mcp_server.py có thể là các ràng buộc riêng biệt với các ràng buộc mà một triển khai sử dụng.
Biến môi trường
Cấu hình được chia thành các nhóm độc lập. Việc trộn lẫn chúng là nguyên nhân phổ biến gây ra các lỗi kết nối khó gỡ lỗi:
| Nhóm | Biến | Kiểm soát |
|---|---|---|
| Kết nối cơ sở dữ liệu ClickHouse | CLICKHOUSE_HOST, CLICKHOUSE_PORT, CLICKHOUSE_SECURE, CLICKHOUSE_VERIFY, các biến chứng chỉ | Cách máy chủ MCP này kết nối đến cụm ClickHouse của bạn qua giao diện HTTP |
| Máy chủ MCP / giao thức | CLICKHOUSE_MCP_*, FASTMCP_SERVER_AUTH, FASTMCP_SERVER_AUTH_*, FASTMCP_ENV_FILE | Giao thức MCP, xác thực và giới hạn thực thi công cụ truy vấn |
| Middleware / chDB | MCP_MIDDLEWARE_MODULE, CHDB_* | Các tiện ích mở rộng tùy chọn |
[!IMPORTANT]
CLICKHOUSE_SECURE,CLICKHOUSE_VERIFY,CLICKHOUSE_CA_CERT,CLICKHOUSE_CLIENT_CERT,CLICKHOUSE_CLIENT_CERT_KEY,CLICKHOUSE_TLS_MODEvàCLICKHOUSE_PORTchỉ áp dụng cho kết nối cơ sở dữ liệu ClickHouse đi ra. Chúng không cấu hình TLS, chứng chỉ máy khách, cổng hoặc xác thực cho điểm cuối MCP HTTP/SSE đi vào.Ví dụ: nếu máy chủ MCP chạy trong Kubernetes phía sau một ingress kết thúc TLS, đó là vấn đề giao thức MCP. Giữ
CLICKHOUSE_SECUREphù hợp với cách pod tiếp cận chính ClickHouse (HTTPS →true, HTTP thường →false). ĐặtCLICKHOUSE_SECURE=falsevì máy chủ MCP ở phía sau ingress sẽ khiến máy chủ gọi ClickHouse qua HTTP—thường là với cổng chỉ HTTPS—và tạo ra các lỗi HTTP/TLS khó hiểu trong nhật ký máy chủ.
Kết nối cơ sở dữ liệu ClickHouse
Các biến này cấu hình máy khách HTTP clickhouse-connect và hành vi của các công cụ hỗ trợ ClickHouse như run_query, list_databases và list_tables.
mcp-clickhouse yêu cầu clickhouse-connect 1.x, bắt đầu từ 1.0.0.
Biến bắt buộc
CLICKHOUSE_HOST: Tên máy chủ của máy chủ ClickHouse của bạn (điểm cuối cơ sở dữ liệu, không phải địa chỉ liên kết máy chủ MCP)CLICKHOUSE_USER: Tên người dùng để xác thực ClickHouseCLICKHOUSE_PASSWORD: Mật khẩu để xác thực ClickHouse- Bắt buộc trừ khi
CLICKHOUSE_CLIENT_CERTsử dụng mặc định hoặc chế độ TLS"mutual" - Trong chế độ mặc định hoặc
"mutual", xác thực chứng chỉ được sử dụng và mật khẩu không được gửi
- Bắt buộc trừ khi
[!CAUTION] Điều quan trọng là phải đối xử với người dùng cơ sở dữ liệu MCP của bạn như bất kỳ máy khách bên ngoài nào kết nối với cơ sở dữ liệu của bạn, chỉ cấp các quyền tối thiểu cần thiết cho hoạt động của nó. Việc sử dụng người dùng mặc định hoặc quản trị viên phải được tránh nghiêm ngặt mọi lúc.
Biến tùy chọn
CLICKHOUSE_PORT: Cổng giao diện HTTP của máy chủ ClickHouse của bạn- Mặc định:
8443nếuCLICKHOUSE_SECURE=true,8123nếuCLICKHOUSE_SECURE=false - Thường không cần đặt trừ khi sử dụng cổng không chuẩn
- Phải là cổng giao diện HTTP, không phải cổng giao thức TCP gốc được sử dụng bởi
clickhouse-client - Các giá trị phổ biến:
- HTTP:
8123(thường) /8443(TLS) — được sử dụng bởi máy chủ này và ClickHouse Cloud HTTPS - TCP gốc (không được hỗ trợ ở đây):
9000(thường) /9440(TLS) — được sử dụng bởiclickhouse-client
- HTTP:
- Nếu máy chủ phản hồi với
Port 9000 is for clickhouse-client program, bạn đang trỏ đến giao thức gốc; hãy chuyển sang cổng HTTP (8123/8443hoặc ánh xạ HTTP của triển khai của bạn)
- Mặc định:
CLICKHOUSE_ROLE: Vai trò ClickHouse để sử dụng cho xác thực- Mặc định: Không có
- Đặt giá trị này nếu người dùng của bạn yêu cầu một vai trò cụ thể
CLICKHOUSE_SECURE: Bật HTTPS cho kết nối cơ sở dữ liệu ClickHouse (không phải cho máy khách MCP)- Mặc định:
"true" - Đặt thành
"false"chỉ khi máy chủ MCP tiếp cận ClickHouse qua HTTP thường (điển hình cho Docker Compose cục bộ trên cổng8123) - Để
"true"cho ClickHouse Cloud và bất kỳ điểm cuối cơ sở dữ liệu HTTPS nào—ngay cả khi máy chủ MCP được hiển thị qua HTTP, stdio hoặc ingress kết thúc TLS riêng - Việc không khớp cờ này với cổng cơ sở dữ liệu (ví dụ:
CLICKHOUSE_SECURE=falsevới cổng8443) là lỗi thiết lập thường gặp và thường xuất hiện dưới dạng lỗi máy khách HTTP khó hiểu thay vì thông báo "sai lược đồ" rõ ràng
- Mặc định:
CLICKHOUSE_VERIFY: Bật/tắt xác minh chứng chỉ SSL cho kết nối HTTPS ClickHouse- Mặc định:
"true" - Đặt thành
"false"để tắt xác minh chứng chỉ (không khuyến nghị cho sản xuất) - Chứng chỉ TLS: Gói sử dụng kho tin cậy hệ điều hành của bạn qua
truststore.inject_into_ssl()khi khởi động. Xử lý SSL mặc định của Python được sử dụng nếu việc tiêm bị tắt bằngMCP_CLICKHOUSE_TRUSTSTORE_DISABLE=1hoặc thất bại.
- Mặc định:
MCP_CLICKHOUSE_TRUSTSTORE_DISABLE: Tắt tích hợp kho tin cậy hệ điều hành trên toàn tiến trình cho TLS- Mặc định: không đặt (tích hợp kho tin cậy được bật)
- Đặt chính xác thành
"1"trước khi khởi động để bỏ quatruststore.inject_into_ssl()và sử dụng xử lý chứng chỉ SSL mặc định của Python. Các giá trị khác không tắt tích hợp. - Điều này không tắt xác minh chứng chỉ.
CLICKHOUSE_VERIFYvẫn kiểm soát xác minh cho kết nối HTTPS ClickHouse.
CLICKHOUSE_CA_CERT: Đường dẫn đến gói chứng chỉ CA PEM cho kết nối HTTPS ClickHouse- Mặc định: Không có (sử dụng kho tin cậy hệ điều hành trừ khi tiêm truststore bị tắt hoặc thất bại)
- Sử dụng riêng biến này khi máy chủ ClickHouse hoặc proxy riêng trình bày chứng chỉ được ký bởi CA riêng. Điều này thay đổi xác minh chứng chỉ máy chủ và không bật xác thực chứng chỉ máy khách.
- Yêu cầu
CLICKHOUSE_SECURE=truevàCLICKHOUSE_VERIFY=true
CLICKHOUSE_CLIENT_CERT: Đường dẫn đến chứng chỉ máy khách PEM cho kết nối HTTPS ClickHouse- Mặc định: Không có
- Tệp cũng có thể chứa khóa riêng. Nếu không, hãy đặt
CLICKHOUSE_CLIENT_CERT_KEY. - Người dùng ClickHouse vẫn đến từ
CLICKHOUSE_USER.
CLICKHOUSE_CLIENT_CERT_KEY: Đường dẫn đến khóa riêng PEM choCLICKHOUSE_CLIENT_CERT- Mặc định: Không có
- Tùy chọn khi khóa riêng được bao gồm trong tệp chứng chỉ máy khách
- Không thể sử dụng mà không có
CLICKHOUSE_CLIENT_CERT
CLICKHOUSE_TLS_MODE: Cách clickhouse-connect sử dụngCLICKHOUSE_CLIENT_CERT- Mặc định: Không có, hoạt động như
"mutual"khi chứng chỉ máy khách được đặt "mutual": Sử dụng chứng chỉ máy khách để xác thực người dùng X.509 ClickHouse.CLICKHOUSE_PASSWORDlà tùy chọn và không được gửi."proxy": Trình bày chứng chỉ máy khách cho proxy kết thúc TLS, sau đó sử dụng xác thực Cơ bản ClickHouse.CLICKHOUSE_PASSWORDlà bắt buộc."strict": Trình bày chứng chỉ máy khách vì máy chủ ClickHouse yêu cầu một chứng chỉ ở lớp TLS, sau đó sử dụng xác thực Cơ bản ClickHouse.CLICKHOUSE_PASSWORDlà bắt buộc. Chế độ này không tăng cường xác minh chứng chỉ máy chủ.CLICKHOUSE_VERIFYkiểm soát xác minh đó.- clickhouse-connect xử lý
"proxy"và"strict"giống hệt nhau. Hai tên ghi lại ý định. - Các giá trị được cắt bớt và không phân biệt chữ hoa chữ thường. Giá trị trống được coi là không đặt. Các giá trị khác bị từ chối trước khi máy khách ClickHouse được tạo, tại lần gọi công cụ ClickHouse đầu tiên hoặc kiểm tra
/health. - Yêu cầu
CLICKHOUSE_CLIENT_CERT. Tất cả các tùy chọn chứng chỉ máy khách đều yêu cầuCLICKHOUSE_SECURE=true.
- Mặc định: Không có, hoạt động như
CLICKHOUSE_SERVER_HOST_NAME: Tên máy chủ máy chủ để ghi đè SNI và xác thực chứng chỉ trên kết nối ClickHouse- Mặc định: Không có (sử dụng tên máy chủ kết nối)
- Hữu ích khi kết nối qua proxy hoặc bộ cân bằng tải nơi tên máy chủ chứng chỉ khác với tên máy chủ kết nối. Khi được đặt, tên máy chủ này sẽ được sử dụng cho cả SNI (Chỉ báo tên máy chủ) trong bắt tay TLS và xác thực tên máy chủ chứng chỉ.
CLICKHOUSE_PROXY_PATH: Tiền tố đường dẫn URL cho điểm cuối HTTP ClickHouse- Mặc định: Không có
- Đặt giá trị này khi giao diện HTTP ClickHouse được hiển thị phía sau proxy ngược dưới tiền tố đường dẫn (ví dụ:
/clickhouse)
CLICKHOUSE_CONNECT_TIMEOUT: Thời gian chờ kết nối tính bằng giây cho máy khách ClickHouse- Mặc định:
"30" - Tăng giá trị này nếu bạn gặp thời gian chờ kết nối
- Mặc định:
CLICKHOUSE_SEND_RECEIVE_TIMEOUT: Thời gian chờ gửi/nhận tính bằng giây cho máy khách ClickHouse- Mặc định: giá trị thấp hơn của
300hoặcCLICKHOUSE_MCP_QUERY_TIMEOUT + 5, để các luồng công nhân bỏ chặn ngay sau thời gian chờ truy vấn - Nếu được đặt rõ ràng, giá trị được sử dụng nguyên trạng (ví dụ:
"300"cho các truy vấn chạy lâu)
- Mặc định: giá trị thấp hơn của
CLICKHOUSE_DATABASE: Cơ sở dữ liệu ClickHouse mặc định để sử dụng- Mặc định: Không có (sử dụng mặc định của máy chủ)
- Đặt giá trị này để tự động kết nối đến một cơ sở dữ liệu cụ thể
CLICKHOUSE_ENABLED: Bật/tắt các công cụ cơ sở dữ liệu ClickHouse- Mặc định:
"true" - Đặt thành
"false"để tắt các công cụ ClickHouse khi chỉ sử dụng chDB
- Mặc định:
CLICKHOUSE_ALLOW_WRITE_ACCESS: Cho phép các thao tác ghi (DDL và DML) đối với ClickHouse- Mặc định:
"false" - Đặt thành
"true"để cho phép DDL và DML không phá hủy (CREATE, INSERT, ALTER ADD COLUMN). Các câu lệnh phá hủy bổ sung cầnCLICKHOUSE_ALLOW_DROP=true - Khi bị tắt (mặc định), các truy vấn chạy với cài đặt
readonly=1để ngăn sửa đổi dữ liệu
- Mặc định:
CLICKHOUSE_ALLOW_DROP: Cho phép các thao tác phá hủy (bất kỳDROPhoặcTRUNCATE,DELETEvàUPDATEbao gồm các biến thểALTER TABLE,REPLACE TABLE/REPLACE PARTITION/CREATE OR REPLACE,CLEAR COLUMN/CLEAR INDEX/CLEAR PROJECTIONvàDETACH ... PERMANENTLY)- Mặc định:
"false" - Chỉ có hiệu lực khi
CLICKHOUSE_ALLOW_WRITE_ACCESS=truecũng được đặt - Cổng này là bảo vệ tai nạn nỗ lực tốt nhất trong máy chủ MCP, không phải ranh giới bảo mật. Hạn chế quyền của người dùng ClickHouse để thực thi thực sự (xem Bảo vệ thao tác phá hủy)
- Mặc định:
Tệp chứng chỉ TLS ClickHouse
Các biến chứng chỉ chứa đường dẫn tệp, không phải nội dung PEM. mcp-clickhouse truyền các đường dẫn này đến clickhouse-connect. Đối với Docker hoặc Kubernetes, hãy gắn chứng chỉ và khóa riêng dưới dạng tệp chỉ đọc và sử dụng đường dẫn của chúng bên trong container. Không nhúng khóa riêng vào image, không commit nó vào hệ thống kiểm soát mã nguồn, hoặc đặt nội dung của nó trong biến môi trường.
Trong chế độ mutual, chứng chỉ máy khách được cấu hình xác định tiến trình mcp-clickhouse này là CLICKHOUSE_USER. Nó không xác thực các máy khách MCP đến hoặc truyền danh tính của chúng đến ClickHouse. Cấu hình xác thực truyền tải MCP riêng biệt.
Khởi động lại mcp-clickhouse sau khi thay thế chứng chỉ hoặc khóa tại cùng một đường dẫn khi cần luân chuyển hoặc thu hồi ngay lập tức. Các máy khách được lưu trong bộ nhớ cache có thể giữ lại các kết nối TLS hiện có và bộ nhớ cache không theo dõi nội dung tệp hoặc thời gian sửa đổi.
ClickHouse Cloud không hỗ trợ xác thực chứng chỉ máy khách X.509 cho người dùng cơ sở dữ liệu. Sử dụng CLICKHOUSE_USER và CLICKHOUSE_PASSWORD cho ClickHouse Cloud. Chứng chỉ CA vẫn có thể hữu ích khi một proxy riêng phía trước điểm cuối trình bày chứng chỉ được ký bởi CA riêng.
Máy chủ MCP và truyền tải
Các biến này kiểm soát tiến trình MCP, bao gồm truyền tải, xác thực và giới hạn thực thi công cụ truy vấn. Chúng độc lập với các cài đặt cơ sở dữ liệu ClickHouse ở trên. Xem thêm Xác thực cho Truyền tải HTTP/SSE.
CLICKHOUSE_MCP_SERVER_TRANSPORT: Đặt phương thức truyền tải cho máy chủ MCP- Mặc định:
"stdio" - Các tùy chọn hợp lệ:
"stdio","http","sse". Điều này hữu ích cho phát triển cục bộ với các công cụ như MCP Inspector. stdiolà điển hình cho Claude Desktop;http/ssehiển thị trình lắng nghe mạng (liên kết máy chủ/cổng bên dưới)"sse"chọn truyền tải HTTP+SSE độc lập đã lỗi thời và ghi nhật ký cảnh báo. Sử dụng"http"cho Streamable HTTP trong các triển khai mới.
- Mặc định:
CLICKHOUSE_MCP_BIND_HOST: Máy chủ để liên kết máy chủ MCP khi sử dụng truyền tải HTTP hoặc SSE- Mặc định:
"127.0.0.1" - Đặt thành
"0.0.0.0"để liên kết với tất cả các giao diện mạng (hữu ích cho Docker hoặc truy cập từ xa) - Chỉ được sử dụng khi truyền tải là
"http"hoặc"sse"— không liên quan đếnCLICKHOUSE_HOST
- Mặc định:
CLICKHOUSE_MCP_BIND_PORT: Cổng để liên kết máy chủ MCP khi sử dụng truyền tải HTTP hoặc SSE- Mặc định:
"8000" - Chỉ được sử dụng khi truyền tải là
"http"hoặc"sse"— không liên quan đếnCLICKHOUSE_PORT
- Mặc định:
CLICKHOUSE_MCP_QUERY_TIMEOUT: Thời gian chờ tính bằng giây cho các lệnh gọi công cụ truy vấn- Mặc định:
"30" - Tăng giá trị này nếu bạn thấy lỗi
Query timed out after ...cho các truy vấn nặng - Khi truy vấn hết thời gian chờ, máy chủ cố gắng hủy nó bằng
KILL QUERY - Trừ khi
CLICKHOUSE_SEND_RECEIVE_TIMEOUTđược đặt rõ ràng, thời gian chờ đọc HTTP được giới hạn ở giá trị này cộng thêm năm giây
- Mặc định:
CLICKHOUSE_MCP_MAX_WORKERS: Số lượng tối đa các luồng công nhân truy vấn đồng thời- Mặc định:
"10" - Tăng nếu khối lượng công việc của bạn yêu cầu nhiều lệnh gọi công cụ đồng thời
- Các công cụ siêu dữ liệu sử dụng một nhóm riêng với
min(4, CLICKHOUSE_MCP_MAX_WORKERS)luồng để khám phá lược đồ không thể trì hoãn các truy vấn
- Mặc định:
CLICKHOUSE_MCP_AUTH_TOKEN: Mã thông báo bearer tĩnh cho truyền tải HTTP/SSE- Mặc định: Không có
- Một trong
CLICKHOUSE_MCP_AUTH_TOKEN,FASTMCP_SERVER_AUTH, hoặcCLICKHOUSE_MCP_AUTH_DISABLED=truelà bắt buộc cho truyền tải HTTP/SSE - Tạo bằng
uuidgenhoặcopenssl rand -hex 32 - Máy khách phải gửi mã thông báo này trong tiêu đề
Authorization: Bearer <token>
FASTMCP_SERVER_AUTH: Ủy quyền xác thực cho nhà cung cấp xác thực FastMCP- Mặc định: Không có
- Giá trị là đường dẫn lớp đầy đủ của một lớp con AuthProvider, ví dụ:
fastmcp.server.auth.providers.azure.AzureProviderhoặcfastmcp.server.auth.providers.google.GoogleProvider - Khi được đặt, mcp-clickhouse tải nhà cung cấp từ các biến môi trường
FASTMCP_SERVER_AUTH_*hiện có; để trốngCLICKHOUSE_MCP_AUTH_TOKENtrong chế độ này - Các nhà cung cấp tùy chỉnh không nhận được đối số hàm tạo có nguồn gốc từ môi trường và phải hỗ trợ xây dựng không đối số
- FastMCP 4 không còn hỗ trợ xác minh Supabase HS256. Các triển khai Supabase phải sử dụng RS256 hoặc ES256.
FASTMCP_ENV_FILE: Tệp tùy chọn chứaFASTMCP_SERVER_AUTHvà các biến môi trường dành riêng cho nhà cung cấp- Mặc định: Không có. Khi không được đặt, trình tải tương thích đọc các trường nhà cung cấp còn thiếu từ
.envtrong thư mục làm việc. Nó không đọcFASTMCP_SERVER_AUTHtừ dự phòng đó - Đặt nó trong môi trường tiến trình trước khi khởi động. Một giá trị được tải từ
.envmặc định không thể chuyển hướng trình tải tương thích - Nếu được đặt bởi tiến trình, tệp này có thể cung cấp cả
FASTMCP_SERVER_AUTHvà các trường nhà cung cấp và thay thế dự phòng thư mục làm việc - Các giá trị môi trường tiến trình có quyền ưu tiên không phân biệt chữ hoa chữ thường
- Trình tải tương thích mcp-clickhouse chỉ đọc tệp này khi xây dựng xác thực HTTP/SSE và chỉ đọc các mục
FASTMCP_SERVER_AUTHvàFASTMCP_SERVER_AUTH_*. FastMCP 4 có thể đọc cùng một tệp cho các cài đặt rộng hơn của nó - Việc tải
.envmặc định là riêng biệt. Nó bắt đầu tại thư mục góimcp_clickhouseđã cài đặt, giải quyết các liên kết tượng trưng, đi lên đến gốc hệ thống tệp và tải.envđầu tiên được tìm thấy hoặc không có gì. Nó không bao giờ đọc thư mục làm việc, bất kể phương thức khởi chạy. Tệp đó có thể cung cấpFASTMCP_SERVER_AUTHvà các trường nhà cung cấp cùng với các cài đặt máy chủ khác. Một bản kiểm tra mã nguồn thường tìm thấy.envgốc của kho lưu trữ
- Mặc định: Không có. Khi không được đặt, trình tải tương thích đọc các trường nhà cung cấp còn thiếu từ
CLICKHOUSE_MCP_AUTH_DISABLED: Vô hiệu hóa xác thực cho truyền tải HTTP/SSE- Mặc định:
"false"(xác thực được bật) - Đặt thành
"true"để vô hiệu hóa xác thực chỉ cho phát triển/thử nghiệm cục bộ - CẢNH BÁO: Chỉ sử dụng cho phát triển cục bộ. Không vô hiệu hóa khi tiếp xúc với mạng
- Mặc định:
CLICKHOUSE_MCP_ALLOWED_HOSTS: Các giá trị tiêu đềHostđược phân tách bằng dấu phẩy mà máy chủ HTTP/SSE trả lời- Mặc định cho liên kết loopback: dạng trần và dạng bất kỳ cổng nào của
127.0.0.1,localhostvà[::1] - Nếu được đặt, giá trị phải chứa ít nhất một mục Host.
- Một địa chỉ liên kết cụ thể không phải loopback mặc định là địa chỉ đó và cổng được cấu hình. Một liên kết đại diện như
0.0.0.0hoặc::yêu cầu một giá trị không trống rõ ràng vì Host công khai không thể được suy ra. - Xác thực Host là một lớp bảo vệ chống lại DNS rebinding. Xác thực nguồn gốc bên dưới được MCP yêu cầu riêng biệt.
- Các mục là chính xác (
localhost:8000) hoặc chấp nhận bất kỳ cổng nào (localhost:*). Ví dụ:CLICKHOUSE_MCP_ALLOWED_HOSTS=127.0.0.1:8000,localhost:8000 - Dạng
host:*chỉ khớp với các giá trị mang cổng. Một Host không có cổng (triển khai cổng tiêu chuẩn nơi máy khách bỏ qua:80/:443) phải được liệt kê dưới dạng mục chính xác trần (example.com) nữa. - Các yêu cầu có tiêu đề
Hostkhông khớp hoặc thiếu nhận được421 Misdirected Request. Các yêu cầu GET và HEAD đến/healthđược miễn xác thực Host và Origin để các trình thăm dò điều phối tiếp tục hoạt động. - Đằng sau proxy ngược, ưu tiên giữ nguyên tiêu đề
Hostgốc. Bạn có thể thay vào đó liệt kê giá trịHostthượng nguồn mà proxy gửi. Đặt danh sách rõ ràng khi một trình khởi chạy nhưfastmcp runghi đè địa chỉ liên kết để truy cập từ xa. - mcp-clickhouse buộc tắt bảo vệ Host và Origin riêng của FastMCP.
FASTMCP_HTTP_HOST_ORIGIN_PROTECTION,FASTMCP_HTTP_ALLOWED_HOSTSvàFASTMCP_HTTP_ALLOWED_ORIGINSkhông áp dụng.CLICKHOUSE_MCP_ALLOWED_HOSTSvàCLICKHOUSE_MCP_ALLOWED_ORIGINScó thẩm quyền.
- Mặc định cho liên kết loopback: dạng trần và dạng bất kỳ cổng nào của
CLICKHOUSE_MCP_TRUSTED_PROXIES: Địa chỉ IP proxy hoặc mạng CIDR có tiêu đềX-Forwarded-*được tin cậy- Mặc định: Không có.
X-Forwarded-Hostbị bỏ qua. Xử lý Uvicorn hiện có củaX-Forwarded-ForvàX-Forwarded-Protokhông thay đổi. - Các mục phải là địa chỉ IP hoặc mạng CIDR, chẳng hạn như
127.0.0.1,10.20.0.0/24,2001:db8::1. CIDR phải sử dụng địa chỉ mạng của chúng, vì vậy10.20.0.1/24bị từ chối. Tên máy chủ, địa chỉ IPv6 có phạm vi,*,0.0.0.0/0và::/0cũng bị từ chối. - Sự tin cậy dựa trên đối tác socket thô ngay lập tức. Một yêu cầu từ bất kỳ đối tác nào khác hoặc yêu cầu không có địa chỉ máy khách sẽ bỏ qua
X-Forwarded-Hostvà xác thựcHost. - Một đối tác được tin cậy có thể gửi chính xác một tiêu đề
X-Forwarded-Hostchứa một giá trị không trống. Các trường trùng lặp, giá trị trống và danh sách phân tách bằng dấu phẩy nhận được421 Misdirected Request. Nếu tiêu đề vắng mặt,Hostđược xác thực. - Sử dụng địa chỉ hoặc mạng hẹp nhất có thể. Máy chủ MCP chỉ được truy cập thông qua các proxy trong các phạm vi được cấu hình. Mỗi proxy được tin cậy phải loại bỏ và ghi đè các giá trị
X-Forwarded-HostvàX-Forwarded-Protodo máy khách cung cấp và xây dựngX-Forwarded-Fortừ đối tác kết nối đã xác minh. - Máy chủ tích hợp và
fastmcp runvô hiệu hóa xử lý tiêu đề proxy bên ngoài của Uvicorn, xác thực Host từ đối tác thô, sau đó áp dụngX-Forwarded-ForvàX-Forwarded-Proto. Bật rõ rànguvicorn_config["proxy_headers"]sẽ làm cho việc khởi động thất bại trong chế độ này. - Việc nhúng ASGI trực tiếp phải vô hiệu hóa xử lý tiêu đề proxy trong máy chủ ASGI bên ngoài và gọi
mcp.http_app(raw_client_address_preserved=True). Nếu không có xác nhận rõ ràng đó, việc xây dựng ứng dụng sẽ thất bại khi các proxy được tin cậy được cấu hình.
- Mặc định: Không có.
CLICKHOUSE_MCP_ALLOWED_ORIGINS: Các giá trị tiêu đềOriginđược phân tách bằng dấu phẩy được chấp nhận trên HTTP/SSE- Mặc định: Không có, từ chối mọi yêu cầu mang tiêu đề
Origin - MCP yêu cầu xác thực Origin cho các kết nối truyền tải HTTP/SSE. Các yêu cầu không có Origin được chấp nhận vì các máy khách MCP không phải trình duyệt thường bỏ qua nó. Một Origin không khớp nhận được
403 Forbidden. Điểm cuối/healthđược miễn như mô tả ở trên. - Các mục là chính xác (
http://localhost:3000) hoặc chấp nhận bất kỳ cổng nào (http://localhost:*). Như với máy chủ, dạng bất kỳ cổng nào chỉ khớp với các nguồn gốc mang cổng; một nguồn gốc cổng tiêu chuẩn (https://app.example.com) phải được liệt kê chính xác.
- Mặc định: Không có, từ chối mọi yêu cầu mang tiêu đề
Xử lý Host proxy ngược
Giữ nguyên Host khi có thể. Điều này giữ cho việc tin cậy Host được chuyển tiếp bị vô hiệu hóa:
location / {
proxy_pass http://mcp-clickhouse:8000;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host "";
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
Vệ sinh X-Forwarded-For và X-Forwarded-Proto độc lập với sự tin cậy X-Forwarded-Host. Uvicorn có thể tin cậy các tiêu đề đó dựa trên đối tác proxy ngay cả khi CLICKHOUSE_MCP_TRUSTED_PROXIES không được đặt.
CLICKHOUSE_MCP_ALLOWED_HOSTS=mcp.example.com
nginx tiêu chuẩn thay đổi Host thành tên thượng nguồn cho các yêu cầu được proxy. Nó không tạo hoặc ghi đè X-Forwarded-Host. Nếu không thể giữ nguyên Host, hãy ghi đè tiêu đề được chuyển tiếp tại biên được tin cậy:
location / {
proxy_pass http://mcp-clickhouse:8000;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
CLICKHOUSE_MCP_ALLOWED_HOSTS=mcp.example.com
CLICKHOUSE_MCP_TRUSTED_PROXIES=10.20.0.8
Cấu hình thứ hai chỉ an toàn khi 10.20.0.8 là địa chỉ nguồn ngay lập tức của proxy, cổng máy chủ được cách ly khỏi các máy khách khác và nginx ghi đè các tiêu đề chuyển tiếp đến như được hiển thị. Đối với một chuỗi proxy, mỗi bước nhảy được tin cậy phải loại bỏ các giá trị đến chưa được xác minh trước khi xây dựng các tiêu đề chuyển tiếp mới.
Trên liên kết IPv6 hoặc dual-stack, các proxy IPv4 có thể xuất hiện dưới dạng địa chỉ ánh xạ IPv4 như ::ffff:10.20.0.8; chúng được khớp tự động với các mục IPv4. append_x_forwarded_host của Envoy nối thêm vào X-Forwarded-Host hiện có thay vì ghi đè nó, tạo ra một danh sách phân tách bằng dấu phẩy bị từ chối, vì vậy hãy cấu hình bước nhảy được tin cậy để ghi đè tiêu đề thay thế. Trên Kubernetes với NAT nguồn (ví dụ: externalTrafficPolicy: Cluster), đối tác quan sát được có thể là IP nút thay vì pod proxy, vì vậy hãy tin cậy CIDR pod hoặc nút khi thích hợp; ingress-nginx tự ghi đè cả Host và X-Forwarded-Host.
Biến Middleware
MCP_MIDDLEWARE_MODULE: Tên mô-đun Python chứa middleware tùy chỉnh để chèn vào máy chủ MCP- Mặc định: Không có (không có middleware được tải)
- Đặt thành tên mô-đun (không có phần mở rộng
.py) của mô-đun middleware của bạn - Mô-đun phải cung cấp một hàm
setup_middleware(mcp) - Xem Middleware tùy chỉnh để biết chi tiết và ví dụ
Biến chDB
CHDB_ENABLED: Bật/tắt chức năng chDB- Mặc định:
"false" - Đặt thành
"true"để bật các công cụ chDB - Yêu cầu cài đặt gói bổ sung tùy chọn:
mcp-clickhouse[chdb]
- Mặc định:
CHDB_DATA_PATH: Đường dẫn đến thư mục dữ liệu chDB- Mặc định:
":memory:"(cơ sở dữ liệu trong bộ nhớ) - Sử dụng
:memory:cho cơ sở dữ liệu trong bộ nhớ - Sử dụng đường dẫn tệp để lưu trữ bền vững (ví dụ:
/path/to/chdb/data)
- Mặc định:
Các lỗi cấu hình phổ biến
CLICKHOUSE_SECUREso với MCP / TLS cổng vào — TắtCLICKHOUSE_SECUREvì máy chủ MCP nằm sau cổng vào Kubernetes, proxy ngược hoặc được truy cập qua HTTP thông thường không vô hiệu hóa TLS của cơ sở dữ liệu; nó chỉ thay đổi cách tiến trình này kết nối đến ClickHouse. Cấu hình TLS cổng vào riêng biệt với cài đặt máy khách cơ sở dữ liệu.- Cổng giao thức gốc —
CLICKHOUSE_PORTphải nhắm đến giao diện HTTP của ClickHouse (8123/8443theo mặc định). Các cổng9000/9440dành cho giao thức TCP gốc (clickhouse-client) và sẽ không hoạt động với máy chủ này. - Nhầm lẫn máy chủ —
CLICKHOUSE_HOSTlà tên máy chủ cơ sở dữ liệu.CLICKHOUSE_MCP_BIND_HOSTchỉ là địa chỉ mà máy chủ MCP HTTP/SSE lắng nghe.
Cấu hình ví dụ
Đối với phát triển cục bộ với 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=false
Đối với 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_database
Đối với ClickHouse SQL Playground:
CLICKHOUSE_HOST=sql-clickhouse.clickhouse.com
CLICKHOUSE_USER=demo
CLICKHOUSE_PASSWORD=
# Uses secure defaults (HTTPS on port 8443)
Đối với CA máy chủ riêng tư mà không có xác thực chứng chỉ máy khách:
CLICKHOUSE_HOST=your-secure-clickhouse.example.com
CLICKHOUSE_USER=your-user
CLICKHOUSE_PASSWORD=your-password
CLICKHOUSE_SECURE=true
CLICKHOUSE_VERIFY=true
CLICKHOUSE_CA_CERT=/run/secrets/clickhouse-ca.pem
Đối với xác thực chứng chỉ máy khách X.509 của ClickHouse:
CLICKHOUSE_HOST=your-secure-clickhouse.example.com
CLICKHOUSE_USER=your-certificate-user
CLICKHOUSE_SECURE=true
CLICKHOUSE_CLIENT_CERT=/run/secrets/clickhouse-client.pem
CLICKHOUSE_CLIENT_CERT_KEY=/run/secrets/clickhouse-client-key.pem
# CLICKHOUSE_CA_CERT=/run/secrets/clickhouse-ca.pem # Only for a private server CA
# CLICKHOUSE_TLS_MODE=mutual # Optional. This is the default with a client certificate.
Đối với chứng chỉ máy khách được yêu cầu bởi máy chủ TLS nghiêm ngặt trong khi ClickHouse sử dụng xác thực Basic:
CLICKHOUSE_HOST=your-secure-clickhouse.example.com
CLICKHOUSE_USER=your-user
CLICKHOUSE_PASSWORD=your-password
CLICKHOUSE_SECURE=true
CLICKHOUSE_CLIENT_CERT=/run/secrets/clickhouse-client.pem
CLICKHOUSE_CLIENT_CERT_KEY=/run/secrets/clickhouse-client-key.pem
CLICKHOUSE_TLS_MODE=strict
Sử dụng CLICKHOUSE_TLS_MODE=proxy thay thế khi proxy kết thúc TLS yêu cầu chứng chỉ máy khách
và ClickHouse vẫn sử dụng xác thực Basic.
Chỉ dành cho chDB (trong bộ nhớ):
# chDB configuration
CHDB_ENABLED=true
CLICKHOUSE_ENABLED=false
# CHDB_DATA_PATH defaults to :memory:
Đối với chDB có lưu trữ bền vững:
# chDB configuration
CHDB_ENABLED=true
CLICKHOUSE_ENABLED=false
CHDB_DATA_PATH=/path/to/chdb/data
Đối với MCP Inspector hoặc truy cập từ xa với giao thức 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 send
Đối với phát triển cục bộ với giao thức HTTP (xác thực bị vô hiệu hóa):
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:8000
Khi sử dụng giao thức HTTP, máy chủ sẽ chạy trên cổng đã cấu hình (mặc định 8000). Ví dụ, với cấu hình trên:
- Điểm cuối MCP:
http://localhost:8000/mcp - Kiểm tra sức khỏe:
http://localhost:8000/health
Bạn có thể đặt các biến này trong môi trường của mình, trong tệp .env hoặc trong cấu hình Claude Desktop:
{
"mcpServers": {
"mcp-clickhouse": {
"command": "uv",
"args": [
"run",
"--with",
"mcp-clickhouse",
"--python",
"3.12",
"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"
}
}
}
}
Lưu ý: Cài đặt máy chủ liên kết và cổng chỉ được sử dụng khi giao thức được đặt thành "http" hoặc "sse".
Chạy kiểm thử
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 only
