Начнём с небольшого опыта: AI-приложению нужно получить выручку за месяц из учебной PostgreSQL. Для этого настроим MCP Toolbox for Databases с одним инструментом и заранее заданным SQL-запросом. Проверим результат, запрет записи и отзыв доступа. Рабочие таблицы для такого знакомства не понадобятся.

Руководство адресовано специалистам, которые умеют работать с терминалом, SQL, ролями PostgreSQL и переменными окружения. Выбранные версии: PostgreSQL 17.11, MCP Toolbox for Databases 1.11.0 и MCP Inspector 2.6.0. Команды локальной проверки рассчитаны на macOS Apple Silicon и Bash; Inspector требует Node.js не ниже 22.19.0. Для другой ОС нужен соответствующий официальный бинарный файл Toolbox.

MCP-клиент в AI-приложении вызывает Toolbox, который обращается к учебной PostgreSQL.
В проверочном сценарии вместо модели инструмент вызывает Inspector. Это не подключение к информационной базе 1С.

Кто с кем взаимодействует

В этой схеме у каждого участника своя работа. Пользователь работает в AI-приложении. Встроенный MCP-клиент обращается к Toolbox, а Toolbox выполняет описанный в настройках запрос. PostgreSQL проверяет права отдельной учётной записи и отдаёт разрешённые данные.

В учебной проверке роль диагностического клиента выполняет Inspector: он вызывает инструмент без участия модели. Это проверяет соединение и результат SQL, но не качество ответа конкретного AI-приложения. Различия участников описаны в официальной архитектуре MCP.

Подготовьте локальную среду

Подготовьте отдельный тестовый PostgreSQL, клиент psql и учётную запись администратора этого экземпляра. В примере PostgreSQL работает на 127.0.0.1:55432, Toolbox — на 127.0.0.1:55001. Рабочую базу перенастраивать не нужно. Для TCP-подключений используйте парольную аутентификацию, например scram-sha-256, вместо trust.

Оба сервиса в этом примере работают только локально. Адрес 127.0.0.1 указывает на компьютер самого клиента, поэтому облачное AI-приложение по нему к вашему серверу не подключится. Для облачного клиента понадобится отдельно спроектировать доступ; открывать учебную базу в интернет не следует.

Скачайте Toolbox из официального хранилища, затем проверьте версию:

curl -fL https://storage.googleapis.com/mcp-toolbox-for-databases/v1.11.0/darwin/arm64/toolbox -o toolbox

chmod u+x toolbox

./toolbox --version

Не подменяйте фиксированную версию произвольным latest при воспроизведении. Официальный пример MCP для Toolbox 1.11.0 подтверждает формат конфигурации; права в нашем примере намеренно уже, чем в демонстрации с владельцем базы.

Создайте учебные данные и отдельную роль

Войдите администратором только в тестовый экземпляр:

psql -h 127.0.0.1 -p 55432 -U postgres -d postgres

Создайте базу и роль. Сначала убедитесь, что эти имена свободны и вы подключились к тестовому экземпляру:

CREATE DATABASE deltac_mcp_demo;

CREATE ROLE deltac_mcp_reader LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE NOREPLICATION;

REVOKE ALL ON DATABASE deltac_mcp_demo FROM PUBLIC;

GRANT CONNECT ON DATABASE deltac_mcp_demo TO deltac_mcp_reader;

Переключитесь командой psql \connect deltac_mcp_demo и выполните:

REVOKE ALL ON SCHEMA public FROM PUBLIC;

CREATE SCHEMA demo;

CREATE TABLE demo.sales (month date PRIMARY KEY, revenue numeric(12,2) NOT NULL);

INSERT INTO demo.sales VALUES ('2026-07-01',250000),('2026-08-01',300000);

CREATE TABLE demo.internal_notes (note text);

INSERT INTO demo.internal_notes VALUES ('Закрытые учебные сведения');

GRANT USAGE ON SCHEMA demo TO deltac_mcp_reader;

GRANT SELECT ON demo.sales TO deltac_mcp_reader;

ALTER ROLE deltac_mcp_reader SET statement_timeout = '3s';

Все значения искусственные. Роль получает чтение только таблицы demo.sales; она не владеет базой или схемой. Права на demo.internal_notes не выдаются. Команда GRANT дополняет существующие права, поэтому в реальном окружении отдельно проверяют членство в других ролях и доступ, полученный через PUBLIC.

Задайте пароль через интерактивную команду psql \password deltac_mcp_reader и выйдите командой \q. Так пароль не потребуется записывать в SQL-файл или историю команд. Подключитесь под новой ролью и проверьте чтение:

psql -h 127.0.0.1 -p 55432 -U deltac_mcp_reader -d deltac_mcp_demo

SELECT month, revenue FROM demo.sales ORDER BY month;

Вы должны увидеть две строки: 250000.00 и 300000.00. Затем попробуйте прочитать demo.internal_notes и выполнить INSERT в demo.sales — оба действия должны получить отказ. Так вы проверите реальные права роли.

Учебной роли разрешён SELECT из demo.sales; запись и чтение посторонней таблицы запрещены.
Ограничения обеспечивают права базы данных, а не описание инструмента «только чтение».

Опишите один разрешённый инструмент

Создайте рядом с бинарным файлом tools.yaml со следующим содержимым:

{"kind": "source", "name": "demo-pg", "type": "postgres", "host": "127.0.0.1", "port": 55432, "database": "deltac_mcp_demo", "user": "deltac_mcp_reader", "password": "${DELTAC_MCP_DB_PASSWORD}"}

---

{"kind": "tool", "name": "monthly-sales", "type": "postgres-sql", "source": "demo-pg", "description": "Учебная выручка за месяц в рублях. Данные искусственные. Только чтение.", "annotations": {"readOnlyHint": true, "destructiveHint": false, "idempotentHint": true}, "parameters": [{"name": "month", "type": "string", "description": "Первый день месяца в формате YYYY-MM-01."}], "statement": "SELECT month, revenue FROM demo.sales WHERE month = $1::date LIMIT 1;"}

---

{"kind": "toolset", "name": "demo-readonly", "tools": ["monthly-sales"]}

Тип postgres-sql выполняет заранее заданный запрос. Значение month передаётся как параметр $1, а не подставляется в SQL строковой склейкой. В этом примере клиент не может выбрать другую таблицу или отправить свой текст запроса. Подсказка readOnlyHint описывает поведение, но не создаёт ограничение прав PostgreSQL.

Запустите сервер и получите результат

В Bash введите заданный ранее пароль без отображения и экспортируйте переменную для процесса Toolbox:

read -r -s -p 'Пароль учебной роли: ' DELTAC_MCP_DB_PASSWORD

export DELTAC_MCP_DB_PASSWORD

./toolbox --config tools.yaml --address 127.0.0.1 --port 55001 --allowed-hosts 127.0.0.1 --allowed-origins http://127.0.0.1:6274 --disable-reload --disable-version-check

Эти флаги ограничивают допустимые имена хостов и обращения браузера. Авторизацию пользователей они не добавляют, поэтому такой запуск подходит только для локального учебного стенда. Файл настроек и переменную с паролем не добавляйте в репозиторий.

В другом терминале запросите список инструментов:

npx --yes @modelcontextprotocol/inspector@2.6.0 --cli http://127.0.0.1:55001/mcp --method tools/list --format json

Должен появиться один инструмент monthly-sales с обязательным строковым параметром month. Затем выполните контрольный вызов:

npx --yes @modelcontextprotocol/inspector@2.6.0 --cli http://127.0.0.1:55001/mcp --method tools/call --tool-name monthly-sales --tool-arg month=2026-08-01 --format json

Для августа ожидаем 300000.00. Если указать месяц, которого нет в таблице, результат будет пустым: запись отсутствует, но это ещё не говорит о нулевой выручке. Неверная дата должна приводить к ошибке, а не отключать отбор по месяцу.

Команды относятся к Inspector 2.6.0; параметры версии 1.x не стоит переносить без проверки. Для дальнейшего использования выберите локальное AI-приложение с поддержкой Streamable HTTP, добавьте адрес http://127.0.0.1:55001/mcp по его документации и разрешите только нужный инструмент. Проверьте, что ответ ссылается на фактически полученные данные. Универсального файла настроек для всех AI-приложений нет.

Типичные ошибки

Connection refused: проверьте работающие процессы, адрес и порты. Ошибка пароля: сопоставьте роль, переменную окружения и правила pg_hba.conf. Permission denied: проверьте CONNECT к базе, USAGE к схеме и SELECT к конкретной таблице. Не исправляйте это назначением роли владельцем базы.

Инструмент отсутствует: проверьте имя файла конфигурации и сообщения запуска. В примере отключена автоматическая перезагрузка, поэтому после изменения tools.yaml нужен перезапуск. Неверный транспорт: используйте MCP endpoint /mcp и поддерживающий его клиент; адрес PostgreSQL не является MCP endpoint.

Как отозвать доступ

Остановите Toolbox. В административном сеансе учебной базы запретите новый вход, отзовите права и завершите уже установленные соединения роли:

ALTER ROLE deltac_mcp_reader NOLOGIN;

REVOKE SELECT ON demo.sales FROM deltac_mcp_reader;

REVOKE USAGE ON SCHEMA demo FROM deltac_mcp_reader;

REVOKE CONNECT ON DATABASE deltac_mcp_demo FROM deltac_mcp_reader;

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE usename = 'deltac_mcp_reader' AND pid <> pg_backend_pid();

Удалите подключение из AI-приложения и выполните unset DELTAC_MCP_DB_PASSWORD. Попробуйте войти под учебной ролью снова: вход должен быть запрещён. Учтите, что NOLOGIN не разрывает уже открытые соединения — их завершает отдельная команда выше. Полученные раньше данные могут остаться в истории клиента.

Как этот пример связан с 1С

Здесь мы работали с обычной PostgreSQL и специально созданной таблицей. У информационной базы 1С другая структура хранения и свои правила обработки данных. Для работы с ней нужен ограниченный прикладной API или выгрузка в отдельную витрину. Напрямую записывать данные в таблицы 1С нельзя.

Дальнейший выбор разобран в сравнении MCP и API для 1С. Если данные готовит 1С и передаёт их модели, начните с архитектуры API-интеграции. Успех этого учебного запроса не подтверждает совместимость с конкретной конфигурацией 1С.