ClickHouse
resmiKueri server basis data ClickHouse Anda.
Apa yang bisa Anda lakukan dengan ClickHouse MCP?
- Menjalankan kueri SQL — Minta untuk mengeksekusi kueri SQL apa pun pada klaster ClickHouse Anda melalui
run_query, dengan parameter bernama opsional melaluiparams. - Mendaftar database — Temukan semua database yang tersedia pada klaster ClickHouse Anda menggunakan
list_databases. - Menjelajahi tabel dengan filter — Gunakan
list_tablesuntuk mengeksplorasi tabel dalam database, menerapkan polalike/not_likedan paginasi melaluipage_tokendanpage_size. - Memeriksa skema kueri — Minta
DESCRIBE (<query>)atauEXPLAIN ESTIMATE <query>melaluirun_queryuntuk memeriksa kolom keluaran atau perkiraan pembacaan sebelum mengeksekusi. - Membuat kueri data chDB tertanam — Jalankan SQL langsung terhadap mesin tertanam chDB untuk membuat kueri file, URL, atau database tanpa ETL, menggunakan
run_chdb_select_query.
Dokumentasi
Server MCP ClickHouse
Server MCP untuk ClickHouse.
Server ini mengimplementasikan MCP 2026-07-28 dan mendukung jabat tangan inisialisasi lama dari
2024-11-05 hingga 2025-11-25. Klien modern menggunakan permintaan tanpa sesi dan
server/discover. Klien yang sudah ada dapat terus melakukan negosiasi protokol lama.
[!CATATAN] Permintaan HTTP tanpa
MCP-Protocol-Versiondirutekan melalui penanganan lama sehingga klien dari sebelum2025-06-18dapat terus terhubung. MCP2026-07-28mengizinkan perilaku ini pada server yang mendukung klien tersebut. Klien modern harus mengirim header pada setiap permintaan POST.
Fitur
Perkakas ClickHouse
Respons perkakas ClickHouse adalah string berenkode JSON. Bilangan bulat di luar
[-9007199254740991, 9007199254740991] dikembalikan sebagai string desimal untuk menjaga nilai
yang tepat di klien JavaScript. Ini berlaku untuk baris kueri dan metadata tabel bilangan bulat. Bilangan bulat
dalam rentang aman dan boolean mempertahankan tipe JSON-nya.
-
run_query- Jalankan kueri SQL di klaster ClickHouse Anda.
- Masukan:
query(string): Kueri SQL yang akan dijalankan. - Masukan opsional:
params(objek): Nilai bernama untuk placeholder{name:Type}ClickHouse. Lihat Parameter kueri. - Kueri berjalan dalam mode hanya-baca secara default (
CLICKHOUSE_ALLOW_WRITE_ACCESS=false), tetapi penulisan dapat diaktifkan secara eksplisit jika diperlukan. DESCRIBE (<query>)danEXPLAIN ESTIMATE <query>juga berjalan di sini dan merupakan cara opsional untuk memeriksa skema hasil kueri atau perkiraan pembacaannya. Lihat Memeriksa kueri sebelum menjalankannya.
-
list_databases- Daftarkan semua basis data di klaster ClickHouse Anda.
-
list_tables- Daftarkan tabel dalam basis data dengan paginasi.
- Masukan wajib:
database(string). - Masukan opsional:
like/not_like(string): Terapkan filterLIKEatauNOT LIKEpada nama tabel.page_token(string): Token sekali pakai yang dikembalikan oleh panggilan sebelumnya. Token ini disimpan hingga satu jam.page_size(int, default50): Jumlah tabel yang dikembalikan per halaman; harus lebih besar dari0.include_detailed_columns(bool, defaulttrue): Saatfalse, menghilangkan metadata kolom untuk respons yang lebih ringan sambil mempertahankancreate_table_querylengkap.
- Bentuk respons:
tables: Array objek tabel untuk halaman saat ini.next_page_token: Teruskan nilai sekali pakai ini kembali sebelum kedaluwarsa untuk mengambil halaman berikutnya, ataunullsaat tidak ada lagi tabel.total_tables: Jumlah total tabel yang cocok dengan filter yang diberikan.
Penemuan Skema Agen
Instruksi server menyarankan membaca Skema Agen's
AGENTS.ROOT kanonik melalui run_query saat list_databases mengungkapkan basis data AGENTS,
sebelum menulis SQL analitis. Ini adalah panduan untuk agen: tidak ada metadata
yang diambil secara otomatis, hasil perkakas tidak berubah, dan izin ClickHouse
yang ada tetap berlaku. Jika AGENTS.ROOT hilang atau tidak dapat diakses, penemuan normal
dan kueri tetap tersedia.
Parameter kueri
Teruskan nilai secara terpisah dari SQL melalui objek params opsional:
{
"query": "SELECT {id:UInt32} AS id, {name:String} AS name",
"params": {"id": 13, "name": "O'Reilly"}
}
Gunakan placeholder {name:Type} ClickHouse tanpa memberi tanda kutip. Jaga kurung buka,
nama, dan titik dua tetap berdampingan, seperti pada {id:UInt32}. Spasi setelah titik dua dan
di dalam tipe didukung, seperti pada {id: UInt32} dan {amount:Decimal(18, 4)}.
Untuk kompatibilitas di seluruh versi driver yang didukung, mulailah nama dengan huruf atau
garis bawah dan gunakan hanya huruf, angka, dan garis bawah.
Pemformatan gaya Python %s atau %(name)s dan parameter biner mentah $name$ driver
tidak didukung. Panggilan dengan hanya query tetap berfungsi. Menghilangkan params,
meneruskan null, atau meneruskan objek kosong membuat kueri tidak terikat.
Nilai parameter dapat berupa string JSON, angka, boolean, null, atau array, asalkan
cocok dengan tipe ClickHouse yang dideklarasikan:
- Gunakan
nulldengan tipeNullable(...). - Teruskan bilangan bulat persis di luar rentang aman JavaScript sebagai string desimal, misalnya
"18446744073709551615"dengan{id:UInt64}. Tanggal, stempel waktu, dan desimal persis juga dapat diteruskan sebagai string dengan tipe ClickHouse yang sesuai. - Ikat vektor sebagai satu array, misalnya
{vector:Array(Float32)}dengan"params": {"vector": [0.25, 0.5, 0.75]}. - Null di dalam array bergantung pada driver yang terpasang. Null berfungsi dengan clickhouse-connect 1.8.0 tetapi gagal dengan minimum yang didukung 1.0.0.
- Daftar dan objek JSON tidak dapat diikat ke tipe
TupledanMapClickHouse.
Nilai yang hilang dan tipe yang tidak kompatibel mengembalikan kesalahan kueri. Dengan params yang tidak kosong,
kueri yang membawa banyak awal placeholder {name: yang tidak diakhiri ditolak, termasuk
teks mirip placeholder dalam komentar atau literal string.
Kueri berparameter menggunakan perlindungan penulisan, batas waktu, pembatalan, dan
enkode hasil JSON yang sama dengan kueri lainnya.
Nilai parameter tetap di luar pesan log SQL normal server MCP, tetapi tetap
ada di argumen perkakas MCP dan dapat muncul di kesalahan backend. ClickHouse 26.3.20.7
mensubstitusi nilai ke dalam teks kueri di system.query_log, system.processes,
dan system.text_log. Pengikatan parameter bukanlah fitur privasi dan tidak
mengurangi jumlah nilai vektor yang dikirim dalam panggilan perkakas.
Memeriksa kueri sebelum menjalankannya
run_query juga menjalankan DESCRIBE dan EXPLAIN ESTIMATE. Keduanya adalah pemeriksaan opsional: gunakan DESCRIBE saat Anda memerlukan kolom keluaran dan tipe kueri, dan gunakan EXPLAIN ESTIMATE sebelum SELECT yang berpotensi mahal.
DESCRIBE (<query>) memeriksa skema hasil dan mengembalikan metadata kolom keluaran yang sama dengan 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 harus menganalisis kueri untuk menjawab, sehingga kesalahan analisis muncul di sini, dengan pesan ClickHouse sendiri, alih-alih di tengah proses eksekusi:
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'
Kueri yang terdeskripsi dengan bersih masih dapat gagal saat dijalankan, karena batas memori atau kesalahan server jarak jauh, dan tidak mengatakan apa pun tentang biaya.
EXPLAIN ESTIMATE <query> mengembalikan bagian, baris, dan tanda yang akan dibaca kueri, satu baris per tabel, yang membedakan pencarian kunci utama dari pemindaian penuh:
EXPLAIN ESTIMATE SELECT count() FROM events WHERE id = 42
database table parts rows marks
default events 1 8192 1
Itu adalah perkiraan pembacaan dari tabel keluarga MergeTree, setelah pemangkasan kunci utama dan partisi. Itu bukan waktu proses dan bukan ukuran hasil, dan mesin tabel lain tidak tercakup.
Tidak ada pernyataan yang menjalankan badan kueri, tetapi analisis tidak selalu gratis: DESCRIBE (SELECT (SELECT sleep(1))) mengeksekusi subkueri skalar saat menganalisis. Keduanya hanya-baca dan berfungsi di bawah CLICKHOUSE_ALLOW_WRITE_ACCESS=false default. Lihat dokumentasi ClickHouse untuk EXPLAIN ESTIMATE dan DESCRIBE.
Perkakas chDB
run_chdb_select_query- Jalankan kueri SQL menggunakan mesin ClickHouse tertanam chDB.
- Masukan:
query(string): Kueri SQL yang akan dijalankan. - Bilangan bulat di luar
[-9007199254740991, 9007199254740991]dikembalikan sebagai string desimal. - Kueri data langsung dari berbagai sumber (file, URL, basis data) tanpa proses ETL.
- Memerlukan ekstra opsional
chdb:pip install 'mcp-clickhouse[chdb]'
Titik Akhir Pemeriksaan Kesehatan
Saat berjalan dengan transport HTTP atau SSE, titik akhir pemeriksaan kesehatan tersedia di /health. Titik akhir ini:
- Mengembalikan
200 OK(isi:OK) jika server sehat dan dapat terhubung ke ClickHouse - Mengembalikan
503 Service Unavailabledengan pesan kesalahan umum jika server tidak dapat terhubung ke ClickHouse - Mengembalikan
503jika pemeriksaan ClickHouse tidak selesai dalam dua detik. Permintaan bersamaan berbagi satu pemeriksaan yang sedang berlangsung - Menggunakan kembali hasil pemeriksaan yang selesai selama satu detik, sehingga pemeriksaan yang tiba berurutan tidak masing-masing terhubung ke ClickHouse. Kegagalan atau pemulihan karena itu dapat dilaporkan hingga satu detik terlambat
Permintaan GET dan HEAD ke titik akhir sengaja tidak diautentikasi dan dibebaskan dari validasi Host dan Origin sehingga pemeriksaan orkestrator (mis. liveness/readiness Kubernetes, penyeimbang beban) dapat menggunakan IP pod atau target yang ditetapkan saat runtime tanpa konfigurasi tambahan. /health dicadangkan dan tidak dapat digunakan sebagai jalur transport MCP. Isi respons sengaja dibuat minimal untuk menghindari kebocoran string versi backend atau detail kesalahan; debug kegagalan melalui log server.
Contoh:
curl http://localhost:8000/health
# Response: OK
Keamanan
Autentikasi untuk Transport HTTP/SSE
Saat menggunakan transport HTTP atau SSE, autentikasi wajib secara default. Transport stdio (default) tidak memerlukan autentikasi karena hanya berkomunikasi melalui input/output standar.
Tiga mode autentikasi didukung. Pilih salah satu:
| Mode | Kapan digunakan | Variabel env |
|---|---|---|
| Token pembawa statis | Deployment sederhana, layanan internal | CLICKHOUSE_MCP_AUTH_TOKEN |
| OAuth / OIDC (via FastMCP) | Azure Entra, Google, GitHub, WorkOS, dll. | FASTMCP_SERVER_AUTH=<provider-class-path> (+ variabel FASTMCP_SERVER_AUTH_* khusus penyedia) |
| Dinonaktifkan | Pengembangan lokal saja | CLICKHOUSE_MCP_AUTH_DISABLED=true |
Startup gagal jika tidak ada satu pun yang dikonfigurasi untuk transport HTTP/SSE.
Menyiapkan Autentikasi
-
Buat token aman (dapat berupa string acak apa pun):
# Using uuidgen (macOS/Linux) uuidgen # Using openssl openssl rand -hex 32 -
Konfigurasikan server dengan token:
export CLICKHOUSE_MCP_AUTH_TOKEN="your-generated-token" -
Konfigurasikan klien MCP Anda untuk menyertakan token dalam permintaan:
Untuk Claude Desktop dengan transport HTTP/SSE:
{ "mcpServers": { "mcp-clickhouse": { "url": "http://127.0.0.1:8000", "headers": { "Authorization": "Bearer your-generated-token" } } } }Catatan: titik akhir
/healthsengaja tidak diautentikasi (lihat Titik Akhir Pemeriksaan Kesehatan di atas). Untuk memverifikasi bahwa autentikasi token pembawa benar-benar menolak permintaan yang tidak diautentikasi, akses titik akhir MCP itu sendiri mis. dengan MCP Inspector, atau dengan mengirim POST permintaan JSON-RPC ke/mcpdengan dan tanpa headerAuthorizationdan konfirmasi bahwa panggilan yang tidak diautentikasi mengembalikan401.
OAuth / OIDC via FastMCP
Untuk deployment produksi dengan penyedia identitas (Azure Entra, Google, GitHub, WorkOS, dll.), delegasikan autentikasi ke penyedia auth bawaan FastMCP alih-alih menggunakan token statis. Setel FASTMCP_SERVER_AUTH ke jalur kelas lengkap penyedia auth FastMCP, bersama dengan variabel FASTMCP_SERVER_AUTH_* khusus penyedia, dan biarkan CLICKHOUSE_MCP_AUTH_TOKEN tidak disetel.
Contoh (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 mempertahankan prefiks lingkungan FastMCP 2.14.7 ini untuk penyedia bawaan FastMCP 4.0.0:
| Jalur kelas penyedia | Prefiks variabel penyedia |
|---|---|
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_ |
Tambahkan nama bidang penyedia huruf besar ke prefiks. Lihat dokumentasi FastMCP untuk persyaratan konfigurasi setiap penyedia.
Nilai auth yang diatur langsung di environment proses memiliki prioritas lebih tinggi tanpa membedakan huruf besar/kecil.
Pemuatan default .env dimulai dari direktori paket mcp_clickhouse yang terinstal,
menyelesaikan symlink terlebih dahulu, dan berjalan ke atas hingga root filesystem. Ia memuat
.env pertama yang ditemukan dan tidak memuat apa pun jika tidak ada. Ia tidak pernah membaca direktori
kerja, terlepas dari bagaimana server diluncurkan. Checkout sumber biasanya menemukan
root repositori .env. File tersebut juga dapat menyediakan FASTMCP_SERVER_AUTH dan
field provider-nya. Nilainya memiliki prioritas lebih tinggi daripada file auth eksplisit atau kompatibilitas.
Untuk kompatibilitas FastMCP 2, mcp-clickhouse membaca field provider yang hilang dari .env
di direktori kerja, tetapi fallback kompatibilitas tersebut tidak dapat memilih
FASTMCP_SERVER_AUTH. FASTMCP_ENV_FILE yang diatur di proses menggantikan fallback
kompatibilitas tersebut dan dapat menyediakan field selector dan provider. Atur sebelum startup.
Loader kompatibilitas mcp-clickhouse hanya membaca FASTMCP_SERVER_AUTH dan
FASTMCP_SERVER_AUTH_* dari file tersebut, sehingga tidak dapat menyuntikkan pengaturan CLICKHOUSE_*.
FastMCP 4 dapat menggunakan file yang sama untuk pengaturan yang lebih luas miliknya sendiri. Provider kustom menerima
tidak ada argumen konstruktor yang berasal dari environment dan harus mendukung konstruksi tanpa argumen.
Perlakukan file .env yang ditemukan dan di direktori kerja sebagai konfigurasi autentikasi
tepercaya. Siapa pun yang dapat membuat atau menulis .env di direktori mana pun dari direktori paket
hingga root filesystem dapat mengontrol file mana yang ditemukan, memilih
provider, dan mengatur field-nya. Siapa pun yang dapat menulis file direktori kerja mengontrol setiap field provider
yang tidak ada di proses dan konfigurasi yang ditemukan, termasuk kunci penandatanganan,
penerbit dan endpoint, serta rahasia klien. FASTMCP_ENV_FILE yang diatur di proses yang menunjuk
ke file milik operator menonaktifkan fallback direktori kerja.
FastMCP 4 mengubah penyimpanan klien proxy OAuth default. Deployment yang mengandalkan penyimpanan proxy OAuth default FastMCP 2 harus membuat klien mendaftar dan mengotorisasi lagi. Penyimpanan kustom yang kompatibel, token bearer statis, dan verifikasi JWT tidak terpengaruh.
Mode Pengembangan (Menonaktifkan Autentikasi)
Hanya untuk pengembangan dan pengujian lokal, Anda dapat menonaktifkan autentikasi dengan mengatur:
export CLICKHOUSE_MCP_AUTH_DISABLED=true
export CLICKHOUSE_MCP_ALLOWED_HOSTS=127.0.0.1:8000,localhost:8000
PERINGATAN: Hanya gunakan ini untuk pengembangan lokal. Jangan nonaktifkan autentikasi saat server terpapar ke jaringan mana pun.
Konfigurasi
Server MCP ini mendukung ClickHouse dan chDB. Anda dapat mengaktifkan salah satu atau keduanya sesuai kebutuhan. Python 3.10 hingga 3.14 didukung. Python 3.12 direkomendasikan untuk peluncuran lokal.
-
Buka file konfigurasi Claude Desktop yang terletak di:
- Di macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Di Windows:
%APPDATA%/Claude/claude_desktop_config.json
- Di macOS:
-
Tambahkan berikut ini:
{
"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"
}
}
}
}
Perbarui variabel environment agar menunjuk ke layanan ClickHouse Anda sendiri.
Atau, jika Anda ingin mencobanya dengan ClickHouse SQL Playground, Anda dapat menggunakan konfigurasi berikut:
{
"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"
}
}
}
}
Untuk chDB (mesin ClickHouse tertanam), tambahkan konfigurasi berikut:
{
"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"
}
}
}
}
Anda juga dapat mengaktifkan ClickHouse dan chDB secara bersamaan:
{
"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"
}
}
}
}
-
Temukan entri perintah untuk
uvdan ganti dengan path absolut ke executableuv. Ini memastikan bahwa versiuvyang benar digunakan saat memulai server. Di Mac, Anda dapat menemukan path ini menggunakanwhich uv. -
Mulai ulang Claude Desktop untuk menerapkan perubahan.
Akses Tulis Opsional
Secara default, MCP ini menerapkan kueri read-only sehingga mutasi yang tidak disengaja tidak dapat terjadi selama eksplorasi. Untuk mengizinkan pernyataan DDL atau INSERT, atur variabel environment CLICKHOUSE_ALLOW_WRITE_ACCESS ke true. Server tetap menerapkan mode read-only jika instance ClickHouse itu sendiri melarang penulisan.
Mode read-only masih mengizinkan pengguna ClickHouse untuk membatalkan kuerinya sendiri, termasuk kueri dari koneksi lain yang menggunakan pengguna yang sama. Gunakan pengguna ClickHouse khusus bahkan dalam mode read-only. Gunakan pengguna ClickHouse terpisah untuk workload yang tidak boleh saling membatalkan kueri.
Perlindungan Operasi Destruktif
Bahkan saat akses tulis diaktifkan (CLICKHOUSE_ALLOW_WRITE_ACCESS=true), operasi destruktif memerlukan flag opt-in tambahan untuk keamanan. Pemeriksaan mencakup pernyataan DROP apa pun (termasuk klausa ALTER TABLE ... DROP PARTITION / DROP PART / DROP COLUMN), TRUNCATE apa pun, DELETE dan UPDATE (baik pernyataan ringan maupun mutasi ALTER TABLE ... DELETE / ALTER TABLE ... UPDATE), REPLACE TABLE, CREATE OR REPLACE, ALTER TABLE ... REPLACE PARTITION, ALTER TABLE ... CLEAR COLUMN / CLEAR INDEX / CLEAR PROJECTION, dan DETACH ... PERMANENTLY. Kata kunci di dalam literal string, pengidentifikasi yang dikutip, komentar SQL, dan nama parameter {name:Type} diabaikan, sehingga tidak memicu pemeriksaan maupun menyembunyikan pernyataan darinya.
Pemeriksaan ini berjalan di server MCP dan merupakan pengaman terbaik untuk mencegah kecelakaan. Ini bukan batas keamanan. Batas keamanan adalah grant pengguna ClickHouse. Mode read-only (default) diterapkan di sisi server melalui readonly=1. Gerbang operasi destruktif tidak diterapkan di server.
Untuk mode tulis, berikan server MCP pengguna ClickHouse khusus dengan hanya hak istimewa yang dibutuhkan:
CREATE USER mcp_agent IDENTIFIED BY '...';
GRANT SELECT, INSERT, CREATE TABLE, ALTER ADD COLUMN ON mydb.* TO mcp_agent;
Operasi pengubah data yang memerlukan hak istimewa di luar grant ini gagal di sisi server dengan ACCESS_DENIED, terlepas dari flag MCP. Pengaturan server max_table_size_to_drop dan max_partition_size_to_drop juga dapat membatasi radius ledakan jika dikunci dengan batasan pengaturan.
Untuk mengaktifkan operasi destruktif, atur kedua flag:
"env": {
"CLICKHOUSE_ALLOW_WRITE_ACCESS": "true",
"CLICKHOUSE_ALLOW_DROP": "true"
}
Pendekatan dua tingkat ini membuat penghapusan tidak disengaja menjadi sulit:
- Operasi tulis (INSERT, CREATE, ALTER ADD COLUMN) memerlukan
CLICKHOUSE_ALLOW_WRITE_ACCESS=true - Operasi destruktif (DROP, TRUNCATE, DELETE, UPDATE, dan sisa daftar di atas) juga memerlukan
CLICKHOUSE_ALLOW_DROP=true
Menjalankan Tanpa uv (Menggunakan Python Sistem)
Jika Anda lebih suka menggunakan instalasi Python sistem daripada uv, Anda dapat menginstal paket dari PyPI dan menjalankannya langsung:
-
Instal paket menggunakan pip:
python3 -m pip install mcp-clickhouseUntuk menginstal dukungan chDB juga:
python3 -m pip install 'mcp-clickhouse[chdb]'Untuk meningkatkan ke versi terbaru:
python3 -m pip install --upgrade mcp-clickhouse -
Perbarui konfigurasi Claude Desktop Anda untuk menggunakan Python secara langsung:
{
"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"
}
}
}
}
Atau, Anda dapat menggunakan skrip yang terinstal secara langsung:
{
"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"
}
}
}
}
Catatan: Pastikan untuk menggunakan path lengkap ke executable Python atau skrip mcp-clickhouse jika keduanya tidak ada di PATH sistem Anda. Anda dapat menemukan path menggunakan:
which python3untuk executable Pythonwhich mcp-clickhouseuntuk skrip yang terinstal
Middleware Kustom
Anda dapat menambahkan middleware kustom ke server MCP tanpa memodifikasi kode sumber. FastMCP menyediakan sistem middleware yang memungkinkan Anda mencegat dan memproses pesan protokol MCP (panggilan alat, pembacaan sumber daya, prompt, dll.).
Cara Menggunakan
- Buat modul Python dengan kelas middleware yang memperluas
Middlewaredan fungsisetup_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())
- Atur variabel environment
MCP_MIDDLEWARE_MODULEke nama modul (tanpa ekstensi.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"
}
}
}
}
- Pastikan modul middleware Anda ada di path impor Python (misalnya, di direktori yang sama tempat server MCP berjalan, atau diinstal sebagai paket).
Contoh Middleware
Modul middleware contoh disediakan di example_middleware.py yang menunjukkan pola umum:
- Mencatat semua permintaan MCP
- Mencatat panggilan alat secara khusus
- Mengukur waktu pemrosesan permintaan
Untuk menggunakan contoh:
"env": {
"MCP_MIDDLEWARE_MODULE": "example_middleware"
}
Kemampuan Middleware
Kelas dasar Middleware menyediakan hook untuk berbagai operasi MCP:
on_message(context, call_next)- Dipanggil untuk semua pesanon_request(context, call_next)- Dipanggil untuk semua permintaanon_notification(context, call_next)- Dipanggil untuk semua notifikasion_call_tool(context, call_next)- Dipanggil saat alat dieksekusion_read_resource(context, call_next)- Dipanggil saat sumber daya dibacaon_get_prompt(context, call_next)- Dipanggil saat prompt diambilon_list_tools(context, call_next)- Dipanggil saat mencantumkan alaton_list_resources(context, call_next)- Dipanggil saat mencantumkan sumber dayaon_list_resource_templates(context, call_next)- Dipanggil saat mencantumkan template sumber dayaon_list_prompts(context, call_next)- Dipanggil saat mencantumkan prompt
Setiap hook menerima objek MiddlewareContext yang berisi pesan dan metadata, serta fungsi call_next untuk melanjutkan pipeline.
Konfigurasi Klien Dinamis melalui State Konteks
Middleware dapat mengganti konfigurasi klien ClickHouse berdasarkan permintaan menggunakan kunci state konteks CLIENT_CONFIG_OVERRIDES_KEY. Server menggabungkan override ini dengan konfigurasi dasar dari variabel environment.
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)
Ini memungkinkan kasus penggunaan lanjutan seperti penyesuaian timeout dinamis, routing khusus penyewa, atau pengaturan koneksi per pengguna.
Nilai state harus berupa kamus. Nilai settings dan generic_args bersarang harus berupa
pemetaan dan digabungkan dengan konfigurasi dasar. Nilai yang tidak valid membuat panggilan alat gagal sebelum
klien ClickHouse dibuat. CLICKHOUSE_ROLE tetap aktif kecuali override secara eksplisit
menyediakan settings.role. Kunci role dan ch_role tingkat atas, plus kunci yang sama di bawah
generic_args, ditolak.
Atur verify, ca_cert, client_cert, client_cert_key, tls_mode, server_host_name,
dan pool_mgr hanya sebagai override tingkat atas. Mereka tidak dapat disarangkan di bawah generic_args.
pool_mgr kustom tidak dapat digabungkan dengan pengaturan CA terkelola atau sertifikat klien. Parameter
kueri DSN tidak dapat mengatur kunci ini, dan DSN tidak dapat memilih backend chdb. Gunakan
override tingkat atas eksplisit host, port, username, password, database, dan secure untuk mengubah
koneksi. DSN yang diteruskan tidak menggantikan field koneksi dasar yang terisi atau memilih
TLS. Ia dapat mengisi field kosong dan menyediakan parameter kueri yang didukung seperti query_limit.
Override secure dan verify menerima boolean atau string true dan false.
verify juga menerima proxy, yang berperilaku sebagai
tls_mode: proxy saat tls_mode tidak diatur dan karena itu menggunakan autentikasi Basic dengan
kata sandi environment. Override secure memilih antarmuka https atau http yang cocok dan
tidak mengubah port. Override interface eksplisit harus http atau https dan sesuai
dengan secure. Setelah menggabungkan override, mode sertifikat klien default dan mutual menghilangkan
kata sandi. Mode proxy dan strict menggunakan autentikasi Basic dengan kata sandi environment
kecuali override menyediakan kredensialnya sendiri.
Perlakukan override ini sebagai input middleware tepercaya. Middleware harus mengautentikasi dan mengotorisasi
nilai yang berasal dari permintaan sebelum mengaturnya. Gunakan serializable=False sehingga FastMCP menjaga
nilai dalam state khusus permintaan. serializable=True default menyimpan state sesi dan
ditolak oleh server. Server mengambil snapshot nilai sebelum mengirim pekerjaan database
yang memblokir. Jangan simpan data penyewa di state Konteks lingkup sesi. Override lingkup sesi yang ditolak
tetap terpasang ke sesi MCP lama dan menyebabkan panggilan alat berikutnya dalam sesi tersebut
gagal hingga klien terhubung kembali. Peran ClickHouse per permintaan adalah konfigurasi koneksi,
bukan batas otorisasi penyewa. Terapkan isolasi penyewa dengan pengguna, peran,
dan grant ClickHouse.
Pengembangan
-
Di direktori
test-servicesjalankandocker compose up -duntuk memulai cluster ClickHouse. -
Tambahkan variabel berikut ke file
.envdi root repositori.
Catatan: Penggunaan pengguna default dalam konteks ini dimaksudkan hanya untuk tujuan pengembangan lokal.
CLICKHOUSE_HOST=localhost
CLICKHOUSE_PORT=8123
CLICKHOUSE_USER=default
CLICKHOUSE_PASSWORD=clickhouse
-
Jalankan
uv syncuntuk menginstal dependensi. Untuk menginstaluvikuti petunjuk di sini. Kemudian lakukansource .venv/bin/activate. -
Untuk pengujian mudah dengan MCP Inspector, jalankan
uv run fastmcp dev inspector mcp_clickhouse/mcp_server.py:mcpuntuk memulai server MCP. -
Untuk menguji dengan transport HTTP dan titik akhir pemeriksaan kesehatan:
# 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
Tata Letak Kode
Paket ini menggunakan tata letak modul datar. Mulailah dengan mcp_server.py untuk perakitan server dan pendaftaran, kemudian ikuti implementasinya ke modul pemiliknya.
| Modul | Tanggung Jawab |
|---|---|
| mcp_server.py, main.py | Perakitan startup, pendaftaran alat dan prompt, koordinasi shutdown, dan startup CLI |
| clients.py | Konfigurasi permintaan, koneksi ClickHouse yang di-cache, dan sewa klien |
| queries.py | Eksekusi kueri, pembatalan, dan pengaman operasi destruktif |
| metadata.py | Penemuan basis data dan tabel, model metadata, dan paginasi |
| chdb_backend.py, chdb_prompt.py | Inisialisasi chDB opsional, eksekusi kueri, dan konten prompt |
| health.py, executors.py | Probes dan caching kesehatan, serta kumpulan pekerja yang digunakan oleh operasi server |
| auth.py, transport.py, http_security.py | Pemuatan dotenv, autentikasi, konstruksi aplikasi HTTP/SSE, dan validasi Host/Origin |
| mcp_env.py, serialization.py | Konfigurasi lingkungan dan pengkodean hasil JSON |
| mcp_middleware_hook.py, skills_advisor.py | Pemuatan middleware kustom dan instruksi server |
Setiap perakitan server memiliki kumpulan pekerja, cache klien, kueri aktif, cache paginasi, status kesehatan, dan backend chDB sendiri. Pembersihan pekerja dan klien berjalan saat proses keluar. Impor paket menginisialisasi server default, termasuk saat pertama kali mengimpor modul yang diekstrak.
Dalam pengujian, patch modul atau instance pemilik tempat kode membaca dependensi. Misalnya,
patch mcp_clickhouse.clients.clickhouse_connect.get_client untuk pembuatan klien. Impor
kompatibilitas di mcp_server.py dapat berupa binding terpisah dari yang digunakan implementasi.
Variabel Lingkungan
Konfigurasi dibagi menjadi grup independen. Mencampurnya adalah penyebab umum kegagalan koneksi yang sulit di-debug:
| Grup | Variabel | Mengontrol |
|---|---|---|
| Koneksi basis data ClickHouse | CLICKHOUSE_HOST, CLICKHOUSE_PORT, CLICKHOUSE_SECURE, CLICKHOUSE_VERIFY, variabel sertifikat | Bagaimana server MCP ini terhubung ke klaster ClickHouse Anda melalui antarmuka HTTP |
| Server MCP / transport | CLICKHOUSE_MCP_*, FASTMCP_SERVER_AUTH, FASTMCP_SERVER_AUTH_*, FASTMCP_ENV_FILE | Transport MCP, autentikasi, dan batas eksekusi alat kueri |
| Middleware / chDB | MCP_MIDDLEWARE_MODULE, CHDB_* | Ekstensi opsional |
[!IMPORTANT]
CLICKHOUSE_SECURE,CLICKHOUSE_VERIFY,CLICKHOUSE_CA_CERT,CLICKHOUSE_CLIENT_CERT,CLICKHOUSE_CLIENT_CERT_KEY,CLICKHOUSE_TLS_MODE, danCLICKHOUSE_PORThanya berlaku untuk koneksi basis data ClickHouse keluar. Mereka tidak mengonfigurasi TLS, sertifikat klien, port, atau autentikasi untuk titik akhir MCP HTTP/SSE masuk.Contoh: jika server MCP berjalan di Kubernetes di belakang ingress yang menghentikan TLS, itu adalah masalah transport MCP. Jaga
CLICKHOUSE_SECUREselaras dengan cara pod menjangkau ClickHouse itu sendiri (HTTPS →true, HTTP biasa →false). MengaturCLICKHOUSE_SECURE=falsekarena server MCP berada di belakang ingress akan membuat server menghubungi ClickHouse melalui HTTP—sering kali terhadap port khusus HTTPS—dan menghasilkan kesalahan HTTP/TLS yang tidak jelas di log server.
Koneksi basis data ClickHouse
Variabel-variabel ini mengonfigurasi klien HTTP clickhouse-connect dan perilaku alat berbasis ClickHouse seperti run_query, list_databases, dan list_tables.
mcp-clickhouse memerlukan clickhouse-connect 1.x, dimulai dari 1.0.0.
Variabel Wajib
CLICKHOUSE_HOST: Nama host server ClickHouse Anda (titik akhir basis data, bukan alamat bind server MCP)CLICKHOUSE_USER: Nama pengguna untuk autentikasi ClickHouseCLICKHOUSE_PASSWORD: Kata sandi untuk autentikasi ClickHouse- Wajib kecuali
CLICKHOUSE_CLIENT_CERTmenggunakan default atau mode TLS"mutual" - Dalam mode default atau
"mutual", autentikasi sertifikat digunakan dan kata sandi tidak dikirim
- Wajib kecuali
[!CAUTION] Penting untuk memperlakukan pengguna basis data MCP Anda seperti klien eksternal lain yang terhubung ke basis data Anda, hanya memberikan hak istimewa minimum yang diperlukan untuk operasinya. Penggunaan pengguna default atau administratif harus dihindari secara ketat setiap saat.
Variabel Opsional
CLICKHOUSE_PORT: Port antarmuka HTTP server ClickHouse Anda- Default:
8443jikaCLICKHOUSE_SECURE=true,8123jikaCLICKHOUSE_SECURE=false - Biasanya tidak perlu diatur kecuali menggunakan port non-standar
- Harus berupa port antarmuka HTTP, bukan port protokol TCP asli yang digunakan oleh
clickhouse-client - Nilai umum:
- HTTP:
8123(biasa) /8443(TLS) — digunakan oleh server ini dan ClickHouse Cloud HTTPS - TCP asli (tidak didukung di sini):
9000(biasa) /9440(TLS) — digunakan olehclickhouse-client
- HTTP:
- Jika server merespons dengan
Port 9000 is for clickhouse-client program, Anda diarahkan ke protokol asli; beralihlah ke port HTTP (8123/8443atau pemetaan HTTP deployment Anda)
- Default:
CLICKHOUSE_ROLE: Peran ClickHouse yang digunakan untuk autentikasi- Default: Tidak ada
- Atur ini jika pengguna Anda memerlukan peran tertentu
CLICKHOUSE_SECURE: Aktifkan HTTPS untuk koneksi basis data ClickHouse (bukan untuk klien MCP)- Default:
"true" - Atur ke
"false"hanya saat server MCP menjangkau ClickHouse melalui HTTP biasa (umum untuk Docker Compose lokal di port8123) - Biarkan
"true"untuk ClickHouse Cloud dan titik akhir basis data HTTPS apa pun—bahkan jika server MCP itu sendiri diekspos melalui HTTP, stdio, atau ingress yang menghentikan TLS secara terpisah - Ketidakcocokan bendera ini dengan port basis data (mis.
CLICKHOUSE_SECURE=falseterhadap port8443) adalah kesalahan pengaturan yang sering terjadi dan biasanya muncul sebagai kesalahan klien HTTP yang membingungkan daripada pesan "skema salah" yang jelas
- Default:
CLICKHOUSE_VERIFY: Aktifkan/nonaktifkan verifikasi sertifikat SSL untuk koneksi HTTPS ClickHouse- Default:
"true" - Atur ke
"false"untuk menonaktifkan verifikasi sertifikat (tidak disarankan untuk produksi) - Sertifikat TLS: Paket menggunakan penyimpanan kepercayaan sistem operasi Anda melalui
truststore.inject_into_ssl()saat startup. Penanganan SSL default Python digunakan jika injeksi dinonaktifkan denganMCP_CLICKHOUSE_TRUSTSTORE_DISABLE=1atau gagal.
- Default:
MCP_CLICKHOUSE_TRUSTSTORE_DISABLE: Nonaktifkan integrasi penyimpanan kepercayaan sistem operasi proses-lebar untuk TLS- Default: tidak diatur (integrasi penyimpanan kepercayaan diaktifkan)
- Atur tepat ke
"1"sebelum startup untuk melewatitruststore.inject_into_ssl()dan gunakan penanganan sertifikat SSL default Python. Nilai lain tidak menonaktifkan integrasi. - Ini tidak menonaktifkan verifikasi sertifikat.
CLICKHOUSE_VERIFYmasih mengontrol verifikasi untuk koneksi HTTPS ClickHouse.
CLICKHOUSE_CA_CERT: Jalur ke bundel sertifikat CA PEM untuk koneksi HTTPS ClickHouse- Default: Tidak ada (menggunakan penyimpanan kepercayaan sistem operasi kecuali injeksi truststore dinonaktifkan atau gagal)
- Gunakan ini sendiri saat server ClickHouse atau proksi pribadi menyajikan sertifikat yang ditandatangani oleh CA pribadi. Ini mengubah verifikasi sertifikat server dan tidak mengaktifkan autentikasi sertifikat klien.
- Memerlukan
CLICKHOUSE_SECURE=truedanCLICKHOUSE_VERIFY=true
CLICKHOUSE_CLIENT_CERT: Jalur ke sertifikat klien PEM untuk koneksi HTTPS ClickHouse- Default: Tidak ada
- File mungkin juga berisi kunci pribadi. Jika tidak, atur
CLICKHOUSE_CLIENT_CERT_KEY. - Pengguna ClickHouse tetap berasal dari
CLICKHOUSE_USER.
CLICKHOUSE_CLIENT_CERT_KEY: Jalur ke kunci pribadi PEM untukCLICKHOUSE_CLIENT_CERT- Default: Tidak ada
- Opsional saat kunci pribadi disertakan dalam file sertifikat klien
- Tidak dapat digunakan tanpa
CLICKHOUSE_CLIENT_CERT
CLICKHOUSE_TLS_MODE: Bagaimana clickhouse-connect menggunakanCLICKHOUSE_CLIENT_CERT- Default: Tidak ada, yang berperilaku sebagai
"mutual"saat sertifikat klien diatur "mutual": Gunakan sertifikat klien untuk autentikasi pengguna X.509 ClickHouse.CLICKHOUSE_PASSWORDopsional dan tidak dikirim."proxy": Sajikan sertifikat klien ke proksi penghenti TLS, lalu gunakan autentikasi Basic ClickHouse.CLICKHOUSE_PASSWORDwajib."strict": Sajikan sertifikat klien karena server ClickHouse memerlukannya di lapisan TLS, lalu gunakan autentikasi Basic ClickHouse.CLICKHOUSE_PASSWORDwajib. Mode ini tidak memperkuat verifikasi sertifikat server.CLICKHOUSE_VERIFYmengontrol verifikasi itu.- clickhouse-connect memperlakukan
"proxy"dan"strict"secara identik. Kedua nama tersebut mendokumentasikan niat. - Nilai dipangkas dan tidak peka huruf besar/kecil. Nilai kosong diperlakukan sebagai tidak diatur. Nilai lain ditolak sebelum klien ClickHouse dibuat, pada panggilan alat ClickHouse pertama atau probe
/health. - Memerlukan
CLICKHOUSE_CLIENT_CERT. Semua opsi sertifikat klien memerlukanCLICKHOUSE_SECURE=true.
- Default: Tidak ada, yang berperilaku sebagai
CLICKHOUSE_SERVER_HOST_NAME: Nama host server untuk override SNI dan validasi sertifikat pada koneksi ClickHouse- Default: Tidak ada (menggunakan nama host koneksi)
- Ini berguna saat terhubung melalui proksi atau penyeimbang beban di mana nama host sertifikat berbeda dari nama host koneksi. Saat diatur, nama host ini akan digunakan untuk SNI (Server Name Indication) selama jabat tangan TLS dan untuk validasi nama host sertifikat.
CLICKHOUSE_PROXY_PATH: Awalan jalur URL untuk titik akhir HTTP ClickHouse- Default: Tidak ada
- Atur ini saat antarmuka HTTP ClickHouse diekspos di belakang proksi terbalik di bawah awalan jalur (misalnya,
/clickhouse)
CLICKHOUSE_CONNECT_TIMEOUT: Waktu tunggu koneksi dalam detik untuk klien ClickHouse- Default:
"30" - Tingkatkan nilai ini jika Anda mengalami waktu tunggu koneksi
- Default:
CLICKHOUSE_SEND_RECEIVE_TIMEOUT: Waktu tunggu kirim/terima dalam detik untuk klien ClickHouse- Default: nilai yang lebih rendah dari
300atauCLICKHOUSE_MCP_QUERY_TIMEOUT + 5, sehingga utas pekerja tidak terblokir segera setelah waktu tunggu kueri - Jika diatur secara eksplisit, nilai digunakan apa adanya (mis.
"300"untuk kueri berjalan lama)
- Default: nilai yang lebih rendah dari
CLICKHOUSE_DATABASE: Basis data ClickHouse default yang digunakan- Default: Tidak ada (menggunakan default server)
- Atur ini untuk terhubung otomatis ke basis data tertentu
CLICKHOUSE_ENABLED: Aktifkan/nonaktifkan alat basis data ClickHouse- Default:
"true" - Atur ke
"false"untuk menonaktifkan alat ClickHouse saat hanya menggunakan chDB
- Default:
CLICKHOUSE_ALLOW_WRITE_ACCESS: Izinkan operasi tulis (DDL dan DML) terhadap ClickHouse- Default:
"false" - Atur ke
"true"untuk mengizinkan DDL dan DML non-destruktif (CREATE, INSERT, ALTER ADD COLUMN). Pernyataan destruktif juga memerlukanCLICKHOUSE_ALLOW_DROP=true - Saat dinonaktifkan (default), kueri berjalan dengan pengaturan
readonly=1untuk mencegah modifikasi data
- Default:
CLICKHOUSE_ALLOW_DROP: Izinkan operasi destruktif (semuaDROPatauTRUNCATE,DELETEdanUPDATEtermasuk varianALTER TABLE,REPLACE TABLE/REPLACE PARTITION/CREATE OR REPLACE,CLEAR COLUMN/CLEAR INDEX/CLEAR PROJECTION, danDETACH ... PERMANENTLY)- Default:
"false" - Hanya berlaku saat
CLICKHOUSE_ALLOW_WRITE_ACCESS=truejuga diatur - Gerbang ini adalah pengaman kecelakaan upaya terbaik di server MCP, bukan batas keamanan. Batasi hak akses pengguna ClickHouse untuk penegakan nyata (lihat Perlindungan Operasi Destruktif)
- Default:
File sertifikat TLS ClickHouse
Variabel sertifikat berisi jalur file, bukan konten PEM. mcp-clickhouse meneruskan jalur-jalur ini ke clickhouse-connect. Untuk Docker atau Kubernetes, pasang sertifikat dan kunci privat sebagai file read-only dan gunakan jalurnya di dalam kontainer. Jangan menyematkan kunci privat ke dalam image, mengirimkannya ke kontrol sumber, atau menaruh isinya di variabel lingkungan.
Dalam mode mutual, sertifikat klien yang dikonfigurasi mengidentifikasi proses mcp-clickhouse ini sebagai CLICKHOUSE_USER. Ini tidak mengautentikasi klien MCP yang masuk atau meneruskan identitas mereka ke ClickHouse. Konfigurasikan autentikasi transport MCP secara terpisah.
Mulai ulang mcp-clickhouse setelah mengganti sertifikat atau kunci di jalur yang sama ketika rotasi atau pencabutan segera diperlukan. Klien yang di-cache dapat mempertahankan koneksi TLS yang ada, dan cache tidak melacak konten file atau waktu modifikasi.
ClickHouse Cloud tidak mendukung autentikasi sertifikat klien X.509 untuk pengguna basis data. Gunakan CLICKHOUSE_USER dan CLICKHOUSE_PASSWORD untuk ClickHouse Cloud. Sertifikat CA masih dapat berguna ketika proxy privat di depan endpoint menyajikan sertifikat yang ditandatangani oleh CA privat.
Server MCP dan transport
Variabel-variabel ini mengontrol proses MCP itu sendiri, termasuk transport, autentikasi, dan batas eksekusi alat kueri. Mereka independen dari pengaturan basis data ClickHouse di atas. Lihat juga Autentikasi untuk Transport HTTP/SSE.
CLICKHOUSE_MCP_SERVER_TRANSPORT: Mengatur metode transport untuk server MCP- Default:
"stdio" - Opsi valid:
"stdio","http","sse". Ini berguna untuk pengembangan lokal dengan alat seperti MCP Inspector. stdiokhas untuk Claude Desktop;http/ssemengekspos pendengar jaringan (ikat host/port di bawah)"sse"memilih transport HTTP+SSE standalone yang tidak digunakan lagi dan mencatat peringatan. Gunakan"http"untuk Streamable HTTP dalam penerapan baru.
- Default:
CLICKHOUSE_MCP_BIND_HOST: Host untuk mengikat server MCP saat menggunakan transport HTTP atau SSE- Default:
"127.0.0.1" - Setel ke
"0.0.0.0"untuk mengikat ke semua antarmuka jaringan (berguna untuk Docker atau akses jarak jauh) - Hanya digunakan saat transport adalah
"http"atau"sse"— tidak terkait denganCLICKHOUSE_HOST
- Default:
CLICKHOUSE_MCP_BIND_PORT: Port untuk mengikat server MCP saat menggunakan transport HTTP atau SSE- Default:
"8000" - Hanya digunakan saat transport adalah
"http"atau"sse"— tidak terkait denganCLICKHOUSE_PORT
- Default:
CLICKHOUSE_MCP_QUERY_TIMEOUT: Waktu tunggu dalam detik untuk panggilan alat kueri- Default:
"30" - Tingkatkan ini jika Anda melihat kesalahan
Query timed out after ...untuk kueri berat - Saat kueri melebihi waktu tunggu, server mencoba membatalkannya dengan
KILL QUERY - Kecuali
CLICKHOUSE_SEND_RECEIVE_TIMEOUTdiatur secara eksplisit, waktu tunggu baca HTTP dibatasi pada nilai ini ditambah lima detik
- Default:
CLICKHOUSE_MCP_MAX_WORKERS: Jumlah maksimum utas pekerja kueri bersamaan- Default:
"10" - Tingkatkan jika beban kerja Anda memerlukan banyak panggilan alat bersamaan
- Alat metadata menggunakan kumpulan terpisah dengan
min(4, CLICKHOUSE_MCP_MAX_WORKERS)utas sehingga penemuan skema tidak dapat menunda kueri
- Default:
CLICKHOUSE_MCP_AUTH_TOKEN: Token pembawa statis untuk transport HTTP/SSE- Default: Tidak ada
- Salah satu dari
CLICKHOUSE_MCP_AUTH_TOKEN,FASTMCP_SERVER_AUTH, atauCLICKHOUSE_MCP_AUTH_DISABLED=truewajib untuk transport HTTP/SSE - Buat menggunakan
uuidgenatauopenssl rand -hex 32 - Klien harus mengirim token ini di header
Authorization: Bearer <token>
FASTMCP_SERVER_AUTH: Delegasikan autentikasi ke penyedia auth FastMCP- Default: Tidak ada
- Nilai adalah jalur kelas lengkap dari subkelas AuthProvider, mis.
fastmcp.server.auth.providers.azure.AzureProviderataufastmcp.server.auth.providers.google.GoogleProvider - Saat diatur, mcp-clickhouse memuat penyedia dari variabel lingkungan
FASTMCP_SERVER_AUTH_*yang ada; biarkanCLICKHOUSE_MCP_AUTH_TOKENtidak diatur dalam mode ini - Penyedia kustom tidak menerima argumen konstruktor yang berasal dari lingkungan dan harus mendukung konstruksi tanpa argumen
- FastMCP 4 tidak lagi mendukung verifikasi Supabase HS256. Penerapan Supabase harus menggunakan RS256 atau ES256.
FASTMCP_ENV_FILE: File opsional yang berisiFASTMCP_SERVER_AUTHdan variabel lingkungan khusus penyedia- Default: Tidak ada. Saat tidak diatur, pemuat kompatibilitas membaca bidang penyedia yang hilang dari
.envdi direktori kerja. Ini tidak membacaFASTMCP_SERVER_AUTHdari fallback tersebut - Setel di lingkungan proses sebelum memulai. Nilai yang dimuat dari
.envdefault tidak dapat mengarahkan ulang pemuat kompatibilitas - Jika diatur oleh proses, file ini dapat menyediakan
FASTMCP_SERVER_AUTHdan bidang penyedia dan menggantikan fallback direktori kerja - Nilai lingkungan proses diutamakan tanpa membedakan huruf besar/kecil
- Pemuat kompatibilitas mcp-clickhouse membaca file ini hanya saat membangun autentikasi HTTP/SSE dan membaca hanya entri
FASTMCP_SERVER_AUTHdanFASTMCP_SERVER_AUTH_*. FastMCP 4 dapat membaca file yang sama untuk pengaturan yang lebih luas - Pemuatan
.envdefault terpisah. Ini dimulai di direktori paketmcp_clickhouseyang terinstal, menyelesaikan symlink, berjalan ke atas ke akar sistem file, dan memuat.envpertama yang ditemukan atau tidak sama sekali. Ini tidak pernah membaca direktori kerja, apa pun metode peluncurannya. File itu dapat menyediakanFASTMCP_SERVER_AUTHdan bidang penyedia bersama dengan pengaturan server lainnya. Checkout sumber biasanya menemukan.envakar repositori
- Default: Tidak ada. Saat tidak diatur, pemuat kompatibilitas membaca bidang penyedia yang hilang dari
CLICKHOUSE_MCP_AUTH_DISABLED: Nonaktifkan autentikasi untuk transport HTTP/SSE- Default:
"false"(autentikasi diaktifkan) - Setel ke
"true"untuk menonaktifkan autentikasi hanya untuk pengembangan/pengujian lokal - PERINGATAN: Hanya gunakan untuk pengembangan lokal. Jangan nonaktifkan saat terpapar ke jaringan
- Default:
CLICKHOUSE_MCP_ALLOWED_HOSTS: Nilai headerHostyang dipisahkan koma yang dijawab oleh server HTTP/SSE- Default untuk bind loopback: bentuk telanjang dan port-apa pun dari
127.0.0.1,localhost, dan[::1] - Jika diatur, nilai harus berisi setidaknya satu entri Host.
- Alamat bind non-loopback konkret default ke alamat itu dan port yang dikonfigurasi. Bind wildcard seperti
0.0.0.0atau::memerlukan nilai non-kosong eksplisit karena Host publik tidak dapat disimpulkan. - Validasi Host adalah pertahanan berlapis terhadap DNS rebinding. Validasi Origin di bawah diperlukan secara terpisah oleh MCP.
- Entri tepat (
localhost:8000) atau menerima port apa pun (localhost:*). Contoh:CLICKHOUSE_MCP_ALLOWED_HOSTS=127.0.0.1:8000,localhost:8000 - Bentuk
host:*hanya cocok dengan nilai yang membawa port. Host tanpa port (penerapan port standar di mana klien menghilangkan:80/:443) harus dicantumkan sebagai entri tepat telanjang (example.com) juga. - Permintaan dengan header
Hostyang tidak cocok atau hilang mendapatkan421 Misdirected Request. Permintaan GET dan HEAD ke/healthdikecualikan dari validasi Host dan Origin sehingga probe orkestrator tetap berfungsi. - Di belakang proxy terbalik, lebih suka mempertahankan header
Hostasli. Anda dapat mencantumkan nilaiHostupstream yang dikirim proxy. Setel daftar eksplisit ketika peluncur sepertifastmcp runmenimpa alamat bind untuk akses jarak jauh. - mcp-clickhouse memaksa penjaga Host dan Origin terpisah FastMCP mati.
FASTMCP_HTTP_HOST_ORIGIN_PROTECTION,FASTMCP_HTTP_ALLOWED_HOSTS, danFASTMCP_HTTP_ALLOWED_ORIGINStidak berlaku.CLICKHOUSE_MCP_ALLOWED_HOSTSdanCLICKHOUSE_MCP_ALLOWED_ORIGINSbersifat otoritatif.
- Default untuk bind loopback: bentuk telanjang dan port-apa pun dari
CLICKHOUSE_MCP_TRUSTED_PROXIES: Alamat IP proxy atau jaringan CIDR yang headerX-Forwarded-*-nya dipercaya- Default: Tidak ada.
X-Forwarded-Hostdiabaikan. Penanganan Uvicorn yang ada untukX-Forwarded-FordanX-Forwarded-Prototidak berubah. - Entri harus berupa alamat IP atau jaringan CIDR, seperti
127.0.0.1,10.20.0.0/24,2001:db8::1. CIDR harus menggunakan alamat jaringannya, sehingga10.20.0.1/24ditolak. Nama host, alamat IPv6 dengan cakupan,*,0.0.0.0/0, dan::/0juga ditolak. - Kepercayaan didasarkan pada peer soket mentah langsung. Permintaan dari peer lain mana pun, atau permintaan tanpa alamat klien, mengabaikan
X-Forwarded-Hostdan memvalidasiHost. - Peer tepercaya dapat mengirim tepat satu header
X-Forwarded-Hostyang berisi satu nilai non-kosong. Bidang duplikat, nilai kosong, dan daftar yang dipisahkan koma mendapatkan421 Misdirected Request. Jika header tidak ada,Hostdivalidasi. - Gunakan alamat atau jaringan sesempit mungkin. Server MCP hanya harus dapat dijangkau melalui proxy dalam rentang yang dikonfigurasi. Setiap proxy tepercaya harus menghapus dan menimpa nilai
X-Forwarded-HostdanX-Forwarded-Protoyang disuplai klien, dan membangunX-Forwarded-Fordari peer koneksi yang diverifikasi. - Server bawaan dan
fastmcp runmenonaktifkan penanganan header proxy luar Uvicorn, memvalidasi Host dari peer mentah, lalu menerapkanX-Forwarded-FordanX-Forwarded-Proto. Mengaktifkanuvicorn_config["proxy_headers"]secara eksplisit gagal memulai dalam mode ini. - Penyematan ASGI langsung harus menonaktifkan penanganan header proxy di server ASGI luar dan memanggil
mcp.http_app(raw_client_address_preserved=True). Tanpa penegasan eksplisit itu, konstruksi aplikasi gagal ketika proxy tepercaya dikonfigurasi.
- Default: Tidak ada.
CLICKHOUSE_MCP_ALLOWED_ORIGINS: Nilai headerOriginyang dipisahkan koma diterima di HTTP/SSE- Default: Tidak ada, yang menolak setiap permintaan yang membawa header
Origin - MCP memerlukan validasi Origin untuk koneksi transport HTTP/SSE. Permintaan tanpa Origin diterima karena klien MCP non-browser biasanya menghilangkannya. Origin yang tidak cocok mendapatkan
403 Forbidden. Endpoint/healthdikecualikan seperti dijelaskan di atas. - Entri tepat (
http://localhost:3000) atau menerima port apa pun (http://localhost:*). Seperti dengan host, bentuk port-apa pun hanya cocok dengan origin yang membawa port; origin port standar (https://app.example.com) harus dicantumkan dengan tepat.
- Default: Tidak ada, yang menolak setiap permintaan yang membawa header
Penanganan Host proxy terbalik
Pertahankan Host bila memungkinkan. Ini menjaga kepercayaan Host yang diteruskan tetap nonaktif:
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;
}
Bersihkan X-Forwarded-For dan X-Forwarded-Proto secara independen dari kepercayaan X-Forwarded-Host. Uvicorn dapat mempercayai header tersebut berdasarkan peer proxy bahkan ketika CLICKHOUSE_MCP_TRUSTED_PROXIES tidak diatur.
CLICKHOUSE_MCP_ALLOWED_HOSTS=mcp.example.com
nginx stok mengubah Host menjadi nama upstream untuk permintaan yang diproksi. Ini tidak membuat atau menimpa X-Forwarded-Host. Jika mempertahankan Host tidak memungkinkan, timpa header yang diteruskan di tepi tepercaya:
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
Konfigurasi kedua aman hanya ketika 10.20.0.8 adalah alamat sumber langsung proxy, port server diisolasi dari klien lain, dan nginx menimpa header penerusan masuk seperti yang ditunjukkan. Untuk rantai proxy, setiap hop tepercaya harus membuang nilai masuk yang tidak diverifikasi sebelum membangun header penerusan baru.
Pada bind IPv6 atau dual-stack, proxy IPv4 dapat muncul sebagai alamat yang dipetakan IPv4 seperti ::ffff:10.20.0.8; ini dicocokkan dengan entri IPv4 secara otomatis. append_x_forwarded_host Envoy menambahkan ke X-Forwarded-Host yang ada daripada menimpanya, menghasilkan daftar yang dipisahkan koma yang ditolak, jadi konfigurasikan hop tepercaya untuk menimpa header sebagai gantinya. Di Kubernetes dengan NAT sumber (misalnya externalTrafficPolicy: Cluster) peer yang diamati mungkin merupakan IP node daripada pod proxy, jadi percayai pod atau CIDR node sesuai; ingress-nginx menimpa Host dan X-Forwarded-Host sendiri.
Variabel Middleware
MCP_MIDDLEWARE_MODULE: Nama modul Python yang berisi middleware kustom untuk disuntikkan ke server MCP- Default: Tidak ada (tidak ada middleware yang dimuat)
- Setel ke nama modul (tanpa ekstensi
.py) dari modul middleware Anda - Modul harus menyediakan fungsi
setup_middleware(mcp) - Lihat Middleware Kustom untuk detail dan contoh
Variabel chDB
CHDB_ENABLED: Mengaktifkan/menonaktifkan fungsionalitas chDB- Default:
"false" - Setel ke
"true"untuk mengaktifkan alat chDB - Memerlukan pemasangan ekstra opsional:
mcp-clickhouse[chdb]
- Default:
CHDB_DATA_PATH: Jalur ke direktori data chDB- Default:
":memory:"(basis data dalam memori) - Gunakan
:memory:untuk basis data dalam memori - Gunakan jalur file untuk penyimpanan persisten (misalnya,
/path/to/chdb/data)
- Default:
Kesalahan konfigurasi umum
CLICKHOUSE_SECUREvs TLS MCP / ingress — MematikanCLICKHOUSE_SECUREkarena server MCP berada di belakang ingress Kubernetes, proxy terbalik, atau diakses melalui HTTP biasa tidak menonaktifkan TLS basis data; itu hanya mengubah cara proses ini terhubung ke ClickHouse. Konfigurasikan TLS ingress secara terpisah dari pengaturan klien basis data.- Port protokol native —
CLICKHOUSE_PORTharus menargetkan antarmuka HTTP ClickHouse (8123/8443secara default). Port9000/9440adalah untuk protokol TCP native (clickhouse-client) dan tidak akan berfungsi dengan server ini. - Kebingungan host —
CLICKHOUSE_HOSTadalah nama host basis data.CLICKHOUSE_MCP_BIND_HOSThanyalah alamat tempat server MCP HTTP/SSE mendengarkan.
Contoh Konfigurasi
Untuk pengembangan lokal dengan 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
Untuk 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
Untuk SQL Playground ClickHouse:
CLICKHOUSE_HOST=sql-clickhouse.clickhouse.com
CLICKHOUSE_USER=demo
CLICKHOUSE_PASSWORD=
# Uses secure defaults (HTTPS on port 8443)
Untuk CA server pribadi tanpa autentikasi sertifikat klien:
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
Untuk autentikasi sertifikat klien X.509 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.
Untuk sertifikat klien yang diperlukan oleh server TLS ketat sementara ClickHouse menggunakan autentikasi 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
Gunakan CLICKHOUSE_TLS_MODE=proxy sebagai gantinya ketika proxy penghenti TLS memerlukan sertifikat
klien dan ClickHouse masih menggunakan autentikasi Basic.
Untuk chDB saja (dalam memori):
# chDB configuration
CHDB_ENABLED=true
CLICKHOUSE_ENABLED=false
# CHDB_DATA_PATH defaults to :memory:
Untuk chDB dengan penyimpanan persisten:
# chDB configuration
CHDB_ENABLED=true
CLICKHOUSE_ENABLED=false
CHDB_DATA_PATH=/path/to/chdb/data
Untuk MCP Inspector atau akses jarak jauh dengan transport 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
Untuk pengembangan lokal dengan transport HTTP (autentikasi dinonaktifkan):
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
Saat menggunakan transport HTTP, server akan berjalan pada port yang dikonfigurasi (default 8000). Misalnya, dengan konfigurasi di atas:
- Titik akhir MCP:
http://localhost:8000/mcp - Pemeriksaan kesehatan:
http://localhost:8000/health
Anda dapat mengatur variabel-variabel ini di lingkungan Anda, dalam file .env, atau dalam konfigurasi 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"
}
}
}
}
Catatan: Pengaturan host dan port bind hanya digunakan saat transport diatur ke "http" atau "sse".
Menjalankan tes
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
