Галоўная / Артыкулы

ClickHouse MCP і межы доступу толькі на чытанне: структураваны доступ для агентаў

Доступ MCP толькі на чытанне спыняе запіс, але не памылковыя лічбы, уцечкі паміж кліентамі ці раскрыццё схемы. Што паказвае бенчмарк ClickHouse і як структураваныя інструменты метрык зніжаюць рызыку.

Выдавец: REACTAPP.TOP8 хв чытання1772 слоў

Крыніцы: ClickHouse MCP: Why Read-Only Access Isn’t Enough

Практычна кожны ўражэнні пра падключэнне агента AI да базы дадзеных заканчываецца аднае рэкамендацыёю: выкорыстоўваць з’ёднанне толькі для чытання. Увімкніце readonly=1, надаць толькі права SELECT, і агент зможа пераглядаць даны, але ніколі іх не мяніць. Гэта разумна практыка, але гэта ўсьмо ў адказ на пытанне, якое на самай працы не было справжнім прычынам для абавяння.

ClickHouse неяк недавно працаваў над тэставаннем 28 модэляў на 201 рэальным пытанні, атрыманым з яго внутраньнага агента аналізу. Найкрашчы модэль быў правы 76,6% часоў. Лічнае колькісце неправіх адказоў станавілі неудачныя запыткі. Большасць з іх — запыткі, якія запрацавалі без проблем, але вернулі некарэктныя даны, і з’ёднанне толькі для чытання не можа запобачыць нават аднаму з такіх случаў.

Рэжым «толькі чытанне» вялічы, чы можа агент запісваць. Ён нічога не сказвае пра тое, што можа запытаць агент. Перадача SQL-інструмента модэлю перакладае адпаведальнасць за стварэнне запыткаў: агент выбірае табелі, способы з’еднання, ступень аграгравання, фільтры і колькасць вярнуваных рэядоў. Рэжым «толькі чытанне» не вплывае ні на што з гэтага. Ён заходзіць вашыя даны ад знішчэння, але нічага не робіць, каб яны не былі некорэктнымі. Важным ўсё-такі не ёст толькі чытанне проты запісу, а сама дакладнасць — аб’ектыва проты структураванага.

Што робіць офіцыйны сервер ClickHouse MCP

Афіцыйны сервер ClickHouse/mcp-clickhouse падаець з функцыямі list_databases, list_tables і run_query. По значэнню стандарту ён можа толькі чытаць. Для дазволу запісу трэба настаўіць змэнную сяродовышча, а для небяпечных заповедзей, такіх як DROP, — ўсё іншую змэнную. Для транспортных протакалаў HTTP і SSE аўтэнтыфікацыя ёсць обавязковай з самага пачатку (рабяць токены-носіцы і OAuth/OIDC), і запуск не будзе магчымы, пакуль яе не настаўіць. У даследжэннях радзяць ставіцца да адказвальнага кантэнта базы дадзеных MCP як да будзь-каго званічнага кліента з мінімальнымі правамі.

Два моманты заслуговуюць на увагу. Таймаут запыту выкананы на боку кліента, таму сервер MCP перастае чакаць, але запыт продовжае выкананыцца ў вашай кластэрной структуры. Таксама, параметр readonly=1 прыменяецца да кожнага запыту і не дае вялікіх гарантый. Калі падключыцеся як корыстнік ClickHouse з шырокімі правамі, тады гэты параметр нічога не захоць.

Нават калі все настроена ідэальна, з’еднання толькі для чытання застаецца рызычным, так як агент можа стварыць будзь-які SQL-запіт проты вашага складу. Гэта і ёсць справжняя проблема.

Працоўныя недагоды, якіх не можна выправіць жадным настройкам

Правільнасць мае прыорытэт, адколі жадны параметр ClickHouse не дапамагае ў цым. Наданне агенту можлівасці пісаць SQL прэдполагае, што мадэлі ужо добра вмеюць гэта робіць. Гэта часткова правда, але саме хыбная частка ёсць небяспечной.

Найлепшыя доказы дае сам ClickHouse. Яго тэст Agentic Analytics Benchmark, опублікованы 1 верасня 2026 года, перзапускаў 201 запыт з рэальнага трафіку яго внутршняга аналітычнага асістэнта проты сінтэтычнай рэканструкціі яго ж складу. Найкрашчая мадэль пасягнула 76,6%.

Этыя запытаннія былі заданыя працавальнікамі компаніі, пры чым кожны рэзультат чытаў чалавек, які разумее гэты направленні. Калі адпаведна чвяртая частка адказоў ўскладнена, людзі, якія беруць удзел у процэсе, зможаюць выявіць большасць наследных проблем. Калі той самы модэль будзе выкарыстоўвацца для функцыяй, якія працуюць з клёнтамі, ніхто не зможа пераканацца ў правільнасці рэзультатаў, аднаву не падазроўваючы ў іх некорэктнасці. Точнасць застаецца тая ж, але рызык значна вышэй.

Распад неудач мае больш значэння, чым самы высокі рэзультат. Праблемы пад час адработкі згаслі паштоўна – толькі чатыры з 28 модэляў стварылі такія проблемы. Серэд усіх модэляў найбольшой прычынай неудач была падбір стратэгіі: выбор некорэктнага падходу стварыў 53%–82% усіх працоўных недакладнасцей. Сама компанія ClickHouse смяркаецца, што сінтаксіс і адработка задач ужо рашаныя, і цяпер главныя факторы – гэта модэлюванне дадзеных і кантэкст схемы.

Лепшы прыклад — Fable 5.1. У топ-10 ён паказаў найменшы частаку неправіх планаў, але самы высокі рэшткавы парадакт з-за неправіх дадзеных. Ён стварыў хорашы план, але выбраў неправыя паказнікі чыстацы. Ні адна з гэтых проблем не можа быць выправленая болей розумным модэлем. Обеі з’являюцца тады, калі доступныя вімеры, паказнікі і інтэрвалы часу не ўзначаныя загадзя.

Самэ таму гэтыя аблыкі ўпадзечныя, а не проста раздражаючыя. Неправі план, які выконваецца правільна, дае запыт, які парсуецца, працюе, вяртае радкі і прадае цыфры, якія выглядаюць правдападобна. Не бывае ні аблыкі, ні жоўтай лініі ў журнале. Хтось чытае гэтыя даныя на панелі керування чымусь у Slack і дзеяе на ўжоце.

Сама ClickHouse называе гэта застэрэжэнням. Апавядковы адказы былі створаны, калі тры мадэлі ад разных вэндароў дасяглі згоды, а не праз людскую перапрацоўку; толькі прыблізна палова з гэтых згод была абсолютной, і журы называюць паслабленай. Кансэнсус не ёсць доказам, таму 76,6% — гэта няпэўнае значэнне, якое, верагатна, ўздымаецца занадта высока. У гэтым случае все завісіць ад таго, як выглядаюць бяспекі, а не ад точнага процэнта.

ClickHouse таксама ускладнюе працу паравэльна багатым базам дадзеных. Аб’яднанні ў яго ёсць высокакостныя і складныя, у даследжэннях рэкамендуецца дэнормалізаваць даны і обмежыць колькасць аб’яднанняў, а для большасці алгорытмаў аб’яднанняў табелі з правай стороны знаходзяцца ў памяці у вазе хеш-табелю. Пры аб’яднанні на адной-да-многіх звязках, базаванам на словніку, ClickHouse тылуцькі залішае адну прыдатную строчку і выкасывае рэшту, тады вы отрымлівець менш правільны адпаведзень і жадных памылак. Агент, які дакладна адступаецца да вашага схемы, з упэўненасцю падпадзе ў такія пасткі. Ні readonly=1, ні профіль налашоўкаў, ні квоты не дапамагаюць. Толькі адзьмянэнне прав на стварэнне запытоў у модэлі можа дапамогчы.

Дыямэтар тэнанта як параметр, а не межа

Другія прычыны — гэты тып, які вылучаецца ў разглашэнні вад. У продукцыі з калькуляцыяй для адночасных корыстнікаў ідэнтыфікатар корыстніка ёсць найважлівейшым крэтэрыям у кожным запыце. За дапамогою будзь-яга SQL-інструмента агент запісвае гэты крэтэрыяў у клазу WHERE, які ствараецца пад час выканання, таму модэль можа яго прыхіліць, адмаўліцься ад яго выкарыстоўвання чыста на падставе інфармацыі, прачытанай раней у размове.

Тут хаваецца глыбэйшая структурная проблема. Як толькі сервер MCP отрымае стрынг з’яўлення, ён заходзіць пад іменем адного карыстальніка ClickHouse, прычысленага да адной групы правіл на радкі, не маючы жадных ведамасцей пра тое, які кліент стоіць за кожным запытам. Гэтыя ведамасці знаходзяцца ў вашай аплікацыі, у автэнтыфікованай сесіі, а будзь-які стандартны SQL-інструмент втрачае іх ўжо перад тым, як агент запісае хоць адну лінію.

Працэс аналізу перадае схему

Трэція проблема ўскладненая. Чыба запытаць аб складзе, агент спачатку павінен яго побачыць, таму ён вызывае list_tables, які вяртае всі таблы з іх столбцамі, колькасцю роўнаў і повным запісам CREATE TABLE. Назвы столбцоў, внутршняя тэрміналогія вашай компаніі і таблы, пра існаванне якіх вы забылі, усе гэта потрапляе ў кантэкст мадэлі, а пасля — у логы, трэйсы і зовнішніх сервісаў для аналізу. Гэта не тэорычны вытак, адколі гэта ўсё-такі неабходны першы крок. Дазволаць будзь-які SQL і адкрыць весь схематызм — гэта адна і тая ж рашэнне.

Структураваны доступ

Болей спецыязістычны інструмент для SQL не ўтварае альтэрнатыўы. Альтэрнатывай ёсць яго абсэнт. Запісаўшы раз на вечар жорнал тэрмінаў аналітыкі — адносовыя велічыны, показнікі, іменаваныя метрыкі, правіла для корыстувачаў і прынцыпы працы з часам — прадастаеце агенту толькі гэта. Мадэль выбірае з каталогу дазволеных запытанняў і ніколі не стварае сама запыт.

@hypequery/mcp, бібліятэка для гэтага, прысвячаная чатырох інструментаў:

  • list_datasets: зарэгістраваныя наборы дадзеных з колькасцю ў іх адносовыях велічынах, показніках і метрыках.
  • get_dataset_schema: поля, іменаваныя метрыкі, фільтры і ліміты аднаго набора дадзеных.
  • query_metric: запускае адну іменаваную метрыку.
  • query_dataset: спецыяльны запыт на адной выбранай адносовай велічыні і показніку.

Няма функцыі run_sql, нават абмежанай. Выклік выглядае так:

{
  "name": "query_metric",
  "arguments": {
    "dataset": "orders",
    "metric": "revenue",
    "dimensions": ["country"],
    "filters": [
      { "field": "status", "operator": "eq", "value": "completed" }
    ],
    "orderBy": [{ "field": "revenue", "direction": "desc" }],
  }
}

Агент выбраў паметрык, групаванне і фільтр. Ён не выбраў, што значыць revenue. Гэтае апісанне знаходзіцца ў вашай базе коду, у TypeScript, якая, як і все інша, пераглядваецца і мае версіі, а ваш API і панель керування вікорыстоўваюць тое ж самае. Операторы фільтраў і інтэвалы часу беруцца з фіксаваных набораў, а поля пераверачаюцца на правамільнасць прытым, прычым які-небудзь код запускаецца. Рэжыстры ёсць межаю:

export const datasets = {
  orders: {
    ...Orders,
    metrics: { revenue },
  },
};

Набор дадзеных, які не ў тым об’екце, не можа быць выказаным, аналізаваным чы розпытваным, таму сэт пытанняў, якія можа задаць агент, стае об’ектам, які можна пераглядаць у вашай базе дадзеных. Дыяхунок арэндніка таксама перастае быць чымось, што задае модэль:

await createMCPServer({
  datasets,
  analytics,
  tenantId: 'tenant_123',
});

Гэтае значэнне падае з працэсу хоста, які ужо знае, хто аўтэнтыфікаўся. Калі зарэгіструваць набор дадзеных на аднойчынны ключ без яго задання, сервер адмовіцца запускацца:

MCP server tenantId is required for tenant-scoped datasets

Падчырваныя SQL-запыткі і выразы поль, якія базуюцца на SQL, таксама за значэнням выкарыстоўвання адсіраюцца з адпаведных адказоў, таму модэль бачыць толькі цыфры і назвы поль, а не структуру вашай запыткі.

Калі хадзіць пра косты

Цена — гэта дадзейнічы вопыт. Афіцыйны сервер перадае кліенту толькі readonly, без параметраў max_rows_to_read, max_bytes_to_read чы max_memory_usage, а таксама без прымусовага тайма-ауту для выканання. У разе обліку за выкарыстоўванне рэсурсаў, калі агент павтарае скануванне всей табліцы ў цыкле, гэта лягае на счот білінгу, а обмежаны набор запітоў скарочвае збіты. Але параметр LIMIT обмежвае колькасць вярнуваных рэядоў, а не колькасць сканаваных байтов, і запіт, які працуе над вялікім перыядам часу, таксама чытае всю неабходную інфармацыю. Структураваныя адміністрацыйныя ліміты кантролююць, якія запіты існуюць, а не скількі кошта кожны з іх. Што б вы не выбралі, задаце рэальныя ліміты для рэядоў, байтов, памяці і часу выканання ў профіле налашоўкаў для карыстальніка MCP, а таксама встановіце квоту.

Што гэта не рашае

Нішчо з гэтага не ёсць новім. У працях Саймона Віллісона про смертэльну трыйку рызіків і дэмонстраціі Supabase MCP у 2025 році стверджуецца, што рэжым тылькі для чытання не ёсць межэю безпекі, а Cube і dbt ужо давно просуваюць вікорыстання семантычного шару для агентаў.

Чэсній компроміс — гэта гнучкісць. Структурована поверхня відповідае лішэ на тыя, што було спроектовано, тому запітання поза каталогом не отрымуюць адказаў, тоды як агент з SQL можа імпровізуваты корысні рышэння. Гэта таксама не блокуе усяго іншого. Етыкеткі і опісі наборыв даных потрапляюць до мадэлі і впліваюць на іі поведынку — гэта вужча версія механізму отруення інструментамі, а не яго повна відсутнісць, хоча ці радкі зберыгаюцца у перэвірэному TypeScript, а не на серверы старонняй організаціі. Крым того, кантралявані метрыкі не завадзяць мадэлі неправільно інтэрпрэтуваты правільне чысло у своему підсумку.

Початок з малого

Няма прытваркі мадэляваць усі склады. Выберыце адну паметку, ад койкай залежыць ваш продукт, тую, дзе некалькісны адказ можа завадзіць, задаце яе ўсёродна, занесіце і даце агенту толькі яе. Потым парабялейце тое, што вяртае агент, з тым, што паказвае ваш дашборд. Якшо цыфры збігаюцца, значыць, ваказанне цяпер знаходзіцца там, звядзе куды можна яго прачытаць, і гэта ўсё сэнс.