Підключення MCP-клієнтів
Kandra постачається з динамічним meta-tools MCP (Model Context Protocol) сервером — одним сервером, який під час роботи виявляє кожен Документ/Довідник/Звіт/Обробку/Константу/Enum у вашій конфігурації, замість того щоб постачати окремий написаний вручну інструмент для кожного типу сутності. Підключіть до нього AI-клієнт на робочому столі, і асистент зможе переглядати, які сутності існують, описувати їхні поля, виконувати запити, створювати, оновлювати, проводити, видаляти та запускати звіти — від імені реального користувача та з його правами, так само, як якби цей користувач увійшов у систему.
Ця сторінка описує підключення трьох клієнтів: Claude Code, VS Code / GitHub Copilot Chat і Codex. Кожен приклад нижче — реальна, перевірена конфігурація, а не припущена форма.
Передумови
- Запущений хост Kandra з підключеною MCP-кінцевою точкою (
AddKandraMcp<>()+app.MapKandraMcp()уProgram.cs— див. налаштування самого рушія, якщо підключаєте це у свіжу конфігурацію; у цьому шаблоні це є з коробки). - API-ключ. MCP-кінцева точка приймає лише автентифікацію за API-ключем — JWT (сесія авторизованої
людини) відхиляється з
403 Forbidden, і це зроблено навмисно, щоб MCP-клієнт завжди був чітко ідентифікованим нелюдським викликачем. Створіть ключ для себе в Мій профіль → API-ключі (або для іншого користувача — на сторінці редагування цього користувача); повний механізм описано в розділі «API-ключі» на сторінці Ідентифікація та автентифікація. Відкритий ключ (kdr_...) показується один раз, під час створення — скопіюйте його до закриття діалогу.
У всіх прикладах нижче використовуйте звичайний HTTP-порт (http://localhost:5219/mcp для стандартного
dev-профілю запуску), а не HTTPS. Dev-слухач HTTPS використовує самопідписаний сертифікат, якому більшість
MCP-клієнтів не довіряє, тож замість зрозумілої помилки ви отримаєте незрозумілу помилку TLS-рукостискання.
Використовуйте справжній сертифікат, перш ніж спрямовувати клієнт на HTTPS будь-де, крім локальної розробки.
Claude Code
claude mcp add --transport http kandra http://localhost:5219/mcp --header "X-Api-Key: kdr_..." -s local
--transport http— MCP-сервер є HTTP-кінцевою точкою без стану, а не stdio.--header "X-Api-Key: kdr_..."— той самий заголовок, що й в усіх інших викликах API Kandra за ключем.-s local/-s user— обмежте область реєстрації, щоб ключ ніколи не потрапив у закомічений.mcp.json.-s local(типово) зберігає його у ваших власних налаштуваннях проєкту поза системою контролю версій;-s userзберігає його один раз для всіх проєктів на вашій машині. Область спільного проєкту (-s project, яка записує.mcp.jsonу репозиторій) використовуйте лише для того, де справді немає секрету, — ніколи для цього.
Виконайте claude mcp list, щоб переконатися, що сервер зареєстровано, а потім запитайте Claude про щось, що
потребує живої сутності (наприклад, «які довідники існують у цій конфігурації?»).
VS Code / GitHub Copilot Chat
Вбудована підтримка MCP у VS Code (її використовують і агентний режим Copilot Chat, і інші чат-розширення з
підтримкою MCP) читає .vscode/mcp.json. Використовуйте механізм inputs/${input:...}, щоб ключ
запитувався інтерактивно й зберігався у власному сховищі секретів VS Code, а не записувався у сам файл:
{
"servers": {
"kandra": {
"type": "http",
"url": "http://localhost:5219/mcp",
"headers": {
"X-Api-Key": "${input:kandra-api-key}"
}
}
},
"inputs": [
{
"id": "kandra-api-key",
"type": "promptString",
"description": "Kandra MCP API key",
"password": true
}
]
}
Під час першого запуску сервера VS Code запитує ключ (маскований, оскільки "password": true) і повторно
використовує його протягом сесії, ніколи не записуючи в .vscode/mcp.json — цей файл безпечно комітити як є.
Codex
Codex читає список MCP-серверів із config.toml — або з локального для проєкту .codex/config.toml, або з
~/.codex/config.toml, щоб сервер був доступний у кожному проєкті. Один нюанс, який варто окремо зазначити,
бо він відрізняється від обох клієнтів вище: env_http_headers у Codex зіставляє назву заголовка з назвою
змінної середовища, а не з буквальним значенням заголовка — Codex читає справжній ключ зі змінних
середовища вашої оболонки під час запуску, тож ключ так само не потрапляє у файл конфігурації.
[mcp_servers.kandra]
url = "http://localhost:5219/mcp"
[mcp_servers.kandra.env_http_headers]
X-Api-Key = "KANDRA_API_KEY"
Експортуйте ключ перед запуском Codex (export KANDRA_API_KEY=kdr_... на macOS/Linux, $env:KANDRA_API_KEY = "kdr_..." у PowerShell) — Codex підставляє його в заголовок X-Api-Key у кожному MCP-виклику.
Реальна сесія: запит на звіт, а потім уточнення, якому потрібен той самий контекст:
Окремий користувач без прав адміністратора для агента
Створюйте API-ключ для окремого користувача, який не є адміністратором. Адміністратори обходять усі перевірки прав, тож агент під таким користувачем читає всі регістри та весь журнал і може змінювати що завгодно. Звичайний користувач бачить лише те, що ви йому надали:
A|Register|Viewдає агенту читати всі регістри (list_registers,describe_register,query_register);O|InventoryRegister|Viewдає читати лише цей регістр (назва об'єкта - ім'я класу регістра). Заборона на рівні об'єкта (O|PricesRegister|View= false) ховає один регістр від дозволу на область.A|Accounting|View- окреме право, потрібне дляquery_ledger: право на регістри не відкриває журнал, а право на журнал не відкриває регістри.- Регістр, який користувач не може читати, виглядає так само, як неіснуючий, а недоступні інструменти не потрапляють у список інструментів.
- Звичайні інструменти сутностей керуються звичними правами
A|Document|View,A|Dictionary|Viewтощо.
Те, що агент знає про регістр, береться з [Description] на класі регістра та на неочевидних полях, тож
заповнюйте їх (див. скіл create-register).
Див. також
- Ідентифікація та автентифікація — як ключ створюється, кому належить, кешується та відкликається.
- Огляд атрибутів —
[Description]: що саме AI-клієнт читає про ваші сутності. - План рахунків — структура, що стоїть за інструментом
get_chart_of_accounts. - Загальна архітектура