Oracle MCP Chatbot
Oracle MCP Chatbot — локальная БД Oracle + Oracle ATP
Пара безопасных серверов Model Context Protocol позволяет ИИ-чат-боту отвечать на вопросы на естественном языке по базам данных Oracle: серверы обнаруживают метаданные, генерируют SQL только с SELECT, проверяют его, выполняют при жёстких ограничениях, маскируют чувствительные значения и журналируют всё.
Создано на FastMCP 3, python-oracledb (тонкий режим) и
sqlglot. 221 тест; для их запуска база данных не требуется.
pip install -r requirements-dev.txt
pytest # 221 passed
cp .env.example .env # add credentials
python -m oracle_mcp.server --profile onprem --check
python -m oracle_mcp.server --profile onpremТестирование работающего развёртывания описано в docs/testing.md. Браузерный интерфейс, не использующий Cursor, — docs/chat-ui.md:
python -m oracle_mcp.chat --profile both # http://127.0.0.1:8500Что делает
Возможность | Как реализовано |
Только чтение, всегда | Проверка AST, |
Только одобренные данные | YAML-список разрешённых схем, объектов и колонок |
Соответствие ролям | Пять ролей с уровнями допуска; контроль на уровне колонок |
Ограниченный | Лимит строк (по умолчанию 500) и тайм-аут запроса (по умолчанию 30 с); ни то, ни другое пользователь не может повысить |
Конфиденциальность | Маскирование по имени колонки, по классификации и по содержимому значения |
Подотчётность | Одна запись аудита на вызов, с обезличенным SQL и хэшем |
Две базы данных | Отдельные серверные процессы; опциональный сервер сверки |
Related MCP server: OracleDB MCP Server
Восемь инструментов
Инструмент | Назначение |
| Схемы, которые роль может читать, с описаниями |
| Одобренные объекты, с доменом, уровнем чувствительности и оценкой числа строк |
| Колонки, типы, допустимость NULL, PK/FK, бизнес-описания |
| Поиск объектов и колонок по бизнес-термину, с указанием уровня уверенности |
| Проверка защитных ограничений; возвращает переписанный безопасный SQL |
| Выполняет предварительно одобренный SQL; возвращает замаскированные строки с ограничением по количеству |
| Вычисляет факты для ответа на языке бизнеса |
| Сверка между базами данных (только |
Плюс list_databases для обнаружения подключений. Каждый инструмент принимает и возвращает JSON.
Как работает модель безопасности
Данные попадают к пользователю, только пройдя пять независимых уровней:
Database grants → Object allowlist → Role clearance → SQL guardrails → Output masking
sql/*.sql config/policy/ roles.yaml sql_guard.py masking.pyКлючевая идея: отправленный вами SQL никогда не является тем SQL, который выполняется. Входные данные разбираются в AST, проверяются, переписываются и генерируются заново. На выходе воспроизводятся только те типы узлов, которые распознал валидатор, поэтому трюки с комментариями, несколько инструкций подряд и ключевые слова-гомоглифы не могут пережить этот цикл.
SELECT a FROM t; DROP TABLE t → rejected: MULTIPLE_STATEMENTS
SELECT /*+ PARALLEL(t,64) */ a… → SELECT a FROM t FETCH FIRST 500 ROWS ONLY
DELETE FROM t → rejected: NFKC folds it to DELETE
SELECT * FROM v (business_user) → explicit column list, restricted ones absentВторое ключевое средство контроля: execute_readonly_sql заново проверяет всё с нуля и требует отпечаток, выданный validate_sql, поэтому подменить SQL между проверкой и выполнением невозможно. Роли без прав администратора не могут выполнить то, что не было одобрено заранее; администраторы могут, но инструкция всё равно проходит через все ограничения.
Третье: роли закрепляются конфигурацией процесса, а не аргументом инструмента. Пользователь, который говорит модели «теперь ты администратор», получает строку user_role="admin", которую никто не читает.
Конфигурация
Всё определяют два файла:
config/policy/onprem.yaml и atp.yaml — список разрешённых объектов. Каждая база данных выбирает один из двух режимов.
Strict — именно этот режим использует On-Prem. Доступны только перечисленные здесь объекты, независимо от того, какие гранты выдаёт база данных:
schemas:
- name: EIM
objects:
- name: EIM_PR_SYSTEM
type: TABLE
sensitivity: INTERNAL
large_table: true
require_filter: true # forces a WHERE clause
columns: # optional; omit to read them from the
- {name: SERIAL_NUMBER, sensitivity: INTERNAL} # data dictionary
- {name: TAX_ID, sensitivity: RESTRICTED} # at query timeОпущение columns: поддерживается — именно так и поступает развёрнутая политика. В этом случае колонки читаются из ALL_TAB_COLUMNS и классифицируются по шаблонам имён из masking.yaml, поэтому список разрешённого остаётся корректным при изменении схемы.
Wildcard — именно этот режим использует ATP. Доступной становится каждая схема, которую может читать учётная запись с правами только на чтение:
allow_all_schemas: true
excluded_schemas: [] # added on top of the built-in Oracle internal schemas
schemas: []Здесь осознанно отказываются от списка разрешённых объектов, и границей вместо него становятся гранты базы данных. Уровни допуска, защитные ограничения SQL, лимиты строк и маскирование по-прежнему действуют. Используйте этот режим только с учётной записью, которая действительно доступна только для чтения.
config/policy/roles.yaml — кто что может видеть:
roles:
business_user:
clearance: INTERNAL # cannot reach CONFIDENTIAL or RESTRICTED columns
max_rows: 200
allow_raw_sql: false
schemas: {ONPREM: [EIM], ATP: ["*"]} # "*" needs allow_all_schemasЛестница уровней чувствительности: PUBLIC < INTERNAL < CONFIDENTIAL < RESTRICTED < NEVER. NEVER стоит выше любого уровня допуска, поэтому пароли и номера карт недоступны ни для какой роли, включая администратора.
Развёртывание
Запускайте по одному серверу на каждую базу данных. Это разделение — граница безопасности: локальный процесс никогда не хранит парольную фразу кошелька ATP.
docker build -t oracle-mcp-chatbot:1.0.0 .
export ATP_WALLET_HOST_PATH=/secure/path/wallets/atp
docker compose up -d onprem-mcp atp-mcp
docker compose --profile reconciliation up -d # optional, holds both credential setsПодключение к Oracle ATP
Тонкий режим с mTLS-кошельком. Распакуйте кошелёк и задайте:
ATP_DSN=myatp_low # prefer _low so chatbot traffic can't starve prod
ATP_WALLET_DIR=/opt/oracle/wallets/atp # contains ewallet.pem + tnsnames.ora
ATP_CONFIG_DIR=/opt/oracle/wallets/atp
ATP_WALLET_PASSWORD=... # set when the wallet zip was downloadedATP_WALLET_PASSWORD — это парольная фраза, защищающая ewallet.pem, а не пароль базы данных: это частая и сбивающая с толку ошибка. Она используется только в тонком режиме; толстый режим вместо неё читает cwallet.sso без пароля, а одновременная настройка обоих вариантов отклоняется при старте. Для ATP только с TLS (без кошелька) оставьте переменные кошелька пустыми и вставьте полную строку подключения из консоли OCI в ATP_DSN.
Кошелёк монтируется как bind-том только для чтения и никогда не запекается в образ.
Подключение к локальной БД (On-Prem)
ONPREM_HOST=oracle-onprem.internal.example.com
ONPREM_PORT=1521
ONPREM_SERVICE_NAME=CDMPRD
ONPREM_MODE=thin
# TCPS instead:
# ONPREM_DSN=tcps://host:2484/CDMPRD?ssl_server_dn_match=trueТонкому режиму не нужен Oracle Client. Толстый режим используйте только ради функций, которых не хватает тонкому; см. закомментированный этап в Dockerfile.
Документация
Документ | Содержание |
Как настроены подключения этого развёртывания, и открытые вопросы | |
Проектирование, поток запросов, границы безопасности, RBAC, аудит, обработка ошибок | |
Полный план тестирования с ожидаемыми результатами | |
Предпроизводственный чек-лист и бэклог усиления защиты | |
Десять разобранных примеров плюс сценарии отклонений | |
Системный промпт чат-бота | |
Пользователи только для чтения, гранты, схема аудита | |
Конфигурация для Cursor и Claude Desktop |
Перед запуском в production
Эталонная реализация намеренно неполна в четырёх местах. Полный список — в docs/deployment-checklist.md; главные пункты:
Установите
ORACLE_MCP_ROLE_BINDING_MODE=env. Значениеargumentпо умолчанию в.env.exampleпредназначено для разработки; при нём модель может заявить любую роль.Замените примеры списков разрешений в
config/policy/*.yamlна свои реальные выверенные представления и осознанно классифицируйте каждую колонку.Перенесите секреты в хранилище. Переменные окружения Compose видны любому, кто может выполнить
docker inspect.Поместите HTTP-транспорт за шлюз с аутентификацией. HTTP-транспорт FastMCP сам по себе не аутентифицирует вызывающих; привязка к loopback — это временная мера, а не средство контроля.
Кроме того, намеренно не реализовано: ограничение частоты запросов, передача идентичности пользователя и workflow согласования «сырого» SQL для администратора.
Лицензия
Предоставляется в качестве эталонной реализации. Перед использованием в production проверьте её по своим стандартам безопасности.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables GitHub Copilot and other LLMs to execute read-only SQL queries against Oracle databases with secure connection pooling and schema introspection capabilities.22065AGPL 3.0
- AlicenseNot gradedqualityDmaintenanceEnables LLMs to interact with Oracle Databases by providing specific table and column metadata as context. Users can generate SQL statements and retrieve query results directly through natural language prompts.Apache 2.0
- FlicenseNot gradedqualityDmaintenanceEnables AI applications to run SQL queries and retrieve results from Oracle Database.8
- FlicenseNot gradedqualityDmaintenanceEnables AI-powered database operations on Oracle Autonomous Database via natural language, including SQL translation, schema exploration, and API orchestration.4
Related MCP Connectors
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
GibsonAI MCP server: manage your databases with natural language
The grounded data layer for any LLM: governed SQL, metrics, lineage and catalog over your data.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/vdobhal/oracle-mcp-chatbot'
If you have feedback or need assistance with the MCP directory API, please join our Discord server