oracle-mcp
oracle-mcp
Только чтение сервер базы данных Oracle для Model Context Protocol. Он позволяет ИИ-агентам (Claude Desktop, Claude Code, Cursor, VS Code agents, OpenAI Agents, …) безопасно просматривать большие устаревшие схемы Oracle — тысячи таблиц, сотни пакетов, представления, синонимы, триггеры, последовательности и исходный код PL/SQL — ни разу не изменяя данные.
Он спроектирован как автономный модуль, который работает вместе с существующим "Engineering MCP" (GitLab / Redmine / Taiga / ERPNext): один агент, несколько MCP-серверов.
Модель безопасности в одной строке: сервер выполняет только
SELECTи чтение словаря данных, каждое имя объекта передается как переменная привязки, произвольный SQL проверяется защитным механизмом только для чтения, а учетной записи базы данных должны быть выданы права только на чтение. Защита в глубину, а не единый шлюз.
Содержание
Related MCP server: safe-sql-mcp
Возможности
24 целенаправленных инструмента, охватывающих поиск, описание, DDL, исходный код, зависимости, индексы, ограничения, триггеры, синонимы, статистику, недопустимые объекты и защищенное выполнение
SELECT.Только чтение по построению — SQL-защита, которая отклоняет все, кроме одного,
SELECT/WITH … SELECTбез комментариев.Везде переменные привязки — имена объектов и ключевые слова никогда не вставляются в SQL.
Ограниченно и безопасно — жесткий предел строк (по умолчанию 1000), тайм-аут на оператор, очистка ResultSet.
Пул соединений с прозрачным переподключением (толстый режим / Oracle Instant Client).
Структурированное журналирование в stderr (метка времени, инструмент, затраченное время, строки, схема, SQL) — никогда секреты.
Типизированная таксономия ошибок — соединение / проверка / недопустимый SQL / права / не найдено / тайм-аут / oracle.
Строгая типизация (TypeScript strict) и тестирование (48 модульных тестов для защиты и помощников).
Требования
Node.js ≥ 18
Oracle Instant Client установлен и доступен в путях поиска библиотек (в этой сборке используется толстый режим oracledb).
Windows: папка Instant Client в
PATH.Linux/macOS: в
LD_LIBRARY_PATH/DYLD_LIBRARY_PATHили установитеORACLE_CLIENT_LIB_DIR.
Сетевой доступ к базе данных и учетная запись Oracle только для чтения (см. Безопасность).
Установка
git clone <your-repo>/oracle-mcp.git
cd oracle-mcp
npm install
npm run build # compiles src/ → dist/Проверка без базы данных:
npm test # 48 unit tests (SQL guard, identifiers, formatting)Проверка на реальной базе данных (только чтение):
ORACLE_USER=... ORACLE_PASSWORD=... ORACLE_CONNECT_STRING=host:port/service \
npx tsx scripts/integration-check.tsКонфигурация
Конфигурация задается через переменные окружения. Сервер автоматически загружает файл .env из своего
собственного каталога пакета (скопируйте .env.example → .env), поэтому секреты хранятся рядом с сервером и не
попадают в конфигурацию агента. Конфигурация проверяется при запуске; сервер быстро завершается с понятным
сообщением без секретов, если чего-то не хватает.
Базы данных (одна или несколько)
Сервер может проверять несколько баз данных Oracle одновременно. Каждый инструмент принимает необязательный аргумент
database; если он опущен, используется база по умолчанию.
Одна база данных:
ORACLE_USER="readonly_user"
ORACLE_PASSWORD="change_me"
ORACLE_CONNECT_STRING="host:port/service"Несколько баз данных — перечислите имена, затем укажите переменные для каждого имени с префиксом ORACLE_<ИМЯ>_
(имя в верхнем регистре, неалфавитно-цифровые символы → _):
ORACLE_DATABASES=tcil,sbi_eforex,ybl
ORACLE_DEFAULT_DATABASE=tcil
ORACLE_TCIL_USER="…" ORACLE_TCIL_PASSWORD="…" ORACLE_TCIL_CONNECT_STRING="host:port/service"
ORACLE_SBI_EFOREX_USER="…" ORACLE_SBI_EFOREX_PASSWORD="…" ORACLE_SBI_EFOREX_CONNECT_STRING="host:port/service"
ORACLE_YBL_USER="…" ORACLE_YBL_PASSWORD="…" ORACLE_YBL_CONNECT_STRING="host:port/service"Пулы создаются лениво для каждой базы данных — настройка десяти ничего не стоит, пока они не запрашиваются.
Заключайте пароли в двойные кавычки, чтобы $/# воспринимались буквально.
Совет по строке подключения: для PDB используйте форму имени службы
хост:порт/служба. Более старая формахост:порт:SIDне является Easy Connect — преобразуйте ее (…:порт/служба) или используйте псевдоним tnsnames.
Общие настройки
Переменная | По умолчанию | Описание |
| (из PATH) | Каталог Instant Client. Если не задано, определяется через PATH/LD_LIBRARY_PATH. |
| — | Каталог, содержащий |
|
| Жесткий предел строк, возвращаемых любым инструментом (также максимум, который может запросить вызывающий). |
|
| Тайм-аут на оператор (в толстом режиме |
|
| Размер пула соединений (для каждой базы данных). |
|
| Время простоя соединения (секунды). |
| — | Владелец по умолчанию для инструментов, ограниченных владельцем, если |
|
|
|
Подключение к агенту
oracle-mcp работает по MCP через stdio. Добавьте его рядом с вашим Engineering MCP.
Claude Desktop / Claude Code (claude_desktop_config.json / .mcp.json) — здесь нет секретов; сервер
читает свой собственный .env:
{
"mcpServers": {
"engineering": { "command": "node", "args": ["/path/to/mcp-erpnext/src/index.js"] },
"oracle": {
"command": "node",
"args": ["/path/to/oracle-mcp/dist/index.js"],
"cwd": "/path/to/oracle-mcp"
}
}
}Учетные данные хранятся в oracle-mcp/.env (в gitignore), а не в конфигурации агента. Размещение Oracle на
собственном сервере (а не объединение с JS Engineering MCP) изолирует критичную для безопасности
поверхность базы данных и позволяет предоставлять/развертывать ее независимо.
Архитектура
┌──────────────────────────────────────────────┐
AI agent ──stdio──▶ │ index.ts (McpServer, StdioServerTransport) │
(Claude/Cursor/…) └───────────────┬──────────────────────────────┘
│ registers 24 tools
┌───────────────▼───────────────┐
│ tools/oracle/* │ runSelect · executionPlan · ddl
│ (thin handlers, zod schemas) │ · 20 declarative metadata tools
└───────┬───────────────┬────────┘
guarded SQL │ │ built SQL + binds
┌───────────▼──────┐ ┌─────▼─────────────────────┐
│ validation/ │ │ oracle/client.ts │
│ sqlGuard.ts │ │ • timeout (callTimeout) │
│ (fail-closed) │ │ • row cap + truncation │
└──────────────────┘ │ • ResultSet cleanup │
│ • error → taxonomy │
└─────┬─────────────────────┘
│ pooled connection
┌─────▼───────────────┐
│ oracle/pool.ts │ thick init · pool · reconnect
└─────┬───────────────┘
▼
Oracle DB (ALL_* dictionary + DBMS_METADATA/DBMS_XPLAN)
cross-cutting: config/env.ts (zod-validated) logging/logger.ts (stderr, redacted)
errors.ts (typed taxonomy) utils/ (identifiers, formatting)Структура папок
oracle-mcp/
├── src/
│ ├── index.ts # server bootstrap + graceful shutdown
│ ├── config/env.ts # env loading & validation (zod)
│ ├── logging/logger.ts # structured stderr logger (+ SQL redaction)
│ ├── errors.ts # OracleMcpError + Oracle→taxonomy mapping
│ ├── types/index.ts # shared types
│ ├── validation/sqlGuard.ts # read-only SQL guard ◀── security core
│ ├── utils/
│ │ ├── identifiers.ts # name validation, LIKE-pattern escaping
│ │ └── format.ts # Markdown tables / code blocks
│ ├── oracle/
│ │ ├── pool.ts # thick init, pool lifecycle, reconnect
│ │ └── client.ts # the single query choke-point
│ └── tools/oracle/
│ ├── context.ts # tool type + registration wrapper
│ ├── runSelect.ts # oracle_run_select (guarded)
│ ├── executionPlan.ts # oracle_show_execution_plan
│ ├── ddl.ts # oracle_get_object_ddl / oracle_get_view
│ ├── metadataTools.ts # 20 declarative dictionary tools
│ └── index.ts # catalogue + registerOracleTools()
├── tests/ # vitest unit tests
├── scripts/integration-check.ts
└── .env.exampleПочему такой выбор
Автономный пакет TypeScript, а не часть JS Engineering MCP — изолирует чувствительную к безопасности поверхность, позволяет использовать строго типизированную сборку и независимое развертывание/права.
Толстый режим — выбран для этого развертывания (присутствует Instant Client); обеспечивает максимально широкий набор функций драйвера. Тонкий режим позволил бы убрать зависимость от клиента, если это необходимо.
Декларативные инструменты метаданных — 20 инструментов словаря используют одну безопасную форму (фиксированный SQL + привязки + формат), поэтому добавление инструмента занимает несколько строк, а свойства безопасности единообразны.
Единая точка входа
OracleClient— каждый запрос проходит через нее, поэтому тайм-аут, лимит строк, очистка, сопоставление ошибок и журналирование выполняются ровно в одном месте.
Справочник инструментов
Все инструменты имеют префикс oracle_. Инструменты, ограниченные владельцем, принимают необязательный schema; поисковые инструменты принимают
необязательный limit (ограничен ORACLE_MAX_ROWS). Имена могут быть указаны как OBJECT или SCHEMA.OBJECT.
Инструмент | Ключевые параметры | Назначение |
|
| Выполнить защищенный SELECT только для чтения. |
|
| EXPLAIN PLAN + DBMS_XPLAN для SELECT (без обращения к данным). |
| — | Список владельцев/схем, видимых учетной записи. |
|
| Список таблиц (необязательно с фильтром). |
|
| Таблицы, имена которых содержат ключевое слово. |
|
| Найти таблицу в схемах, включая синонимы. |
|
| Столбцы + типы + допустимость NULL + комментарии. |
|
| Столбцы, имена которых содержат ключевое слово (например, |
|
| Таблицы, имеющие столбец (сначала точные совпадения). |
|
| Индексы со столбцами, уникальностью, типом, статусом. |
|
| PK/FK/UK/CHECK со столбцами, ссылочной таблицей, правилом удаления. |
|
| Триггеры таблицы (время, событие, статус). |
|
| Полный DDL CREATE через |
|
| DDL представления + список столбцов. |
|
| Исходный код спецификации пакета. |
|
| Исходный код тела пакета. |
|
| Поиск пакетов по ключевому слову в имени. |
|
| Поиск процедур/функций (автономных и в пакетах). |
|
| Полнотекстовый поиск по всему исходному коду PL/SQL — ссылки и вызовы. |
|
|
|
|
| Синонимы; |
|
| Количество строк, блоки, средняя длина строки, дата последнего анализа. |
|
| Объекты в состоянии |
|
| Что такое объект (тип/владелец/статус) из |
Как общие вопросы сопоставляются с инструментами
Вопрос | Инструмент |
Где определен |
|
Показать тело пакета |
|
Найти все процедуры, вызывающие |
|
Каждое упоминание |
|
Описать |
|
Столбцы, содержащие "risk" |
|
Индексы / внешние ключи / триггеры таблицы |
|
Объяснить этот запрос |
|
Синонимы, указывающие на таблицу |
|
Недопустимые объекты |
|
Вопросы безопасности
Уровни защиты (эшелонированная оборона):
Учётная запись только для чтения (основная стена). Предоставьте пользователю подключения только
CREATE SESSION+SELECTна объектах (или ролях), которые он должен просматривать, а такжеSELECT_CATALOG_ROLEдля словаря данных. MCP должен быть неспособен выполнять запись независимо от любых ошибок выше по стеку.SQL-защита (
validation/sqlGuard.ts) для единственного свободного инструмента (oracle_run_select) — она отказывает по умолчанию и отклоняет:всё, что не является одиночным
SELECT/WITH … SELECT;INSERT/UPDATE/DELETE/MERGE/…, все DDL,GRANT/REVOKE,COMMIT/ROLLBACK;PL/SQL-блоки (
BEGIN/DECLARE),CALL,EXECUTE [IMMEDIATE],SELECT … INTO,FOR UPDATE;опасные пакеты (
DBMS_SQL,DBMS_SCHEDULER,DBMS_JOB,UTL_FILE,UTL_HTTP, …);точки с запятой / множественные инструкции и все комментарии/подсказки (hints) (классический вектор обхода);
она анализирует проекцию только по коду с замаскированным содержимым строковых литералов, поэтому ключевые слова или точки с запятой, скрытые внутри литералов, не могут ни вызвать ложное срабатывание, ни скрытно протащить вторую инструкцию.
Переменные связывания (bind variables) для каждого имени объекта / ключевого слова в 23 инструментах работы с метаданными — пользовательский ввод является значением, а никогда не текстом SQL. Идентификаторы дополнительно проверяются на соответствие строгому набору символов.
Ограничения — жёсткий лимит строк (
ORACLE_MAX_ROWS),callTimeoutна инструкцию, очистка ResultSet.Никакой утечки секретов — пароли никогда не логируются; логи идут только в stderr (stdout является каналом MCP); SQL в логах усекается по длине.
Примечания
oracle_show_execution_planвыполняетEXPLAIN PLAN, который записывает данные в сессионную глобальную временную таблицуPLAN_TABLE. Это временные служебные метаданные, автоматически отбрасываемые и доступные даже учётным записям только для чтения — никакие производственные данные не читаются и не записываются.Защита намеренно строгая; предпочитайте специализированный инструмент метаданных вместо
oracle_run_select, когда такой существует. Редкий ложный положительный результат (например, столбец, буквально названный в честь нерезервированного ключевого слова) можно обойти с помощью псевдонима.
Примеры
Agent: "Describe mfx_entity_master."
→ oracle_describe_table { table_name: "MFX_ENTITY_MASTER" }
Agent: "Find every procedure that references mfx_transaction."
→ oracle_search_source { keyword: "mfx_transaction", object_type: "PACKAGE BODY" }
Agent: "Show the body of MFX_GET_MARGIN."
→ oracle_get_package_body { package_name: "MFX_GET_MARGIN" }
Agent: "What foreign keys does mfx_transaction have?"
→ oracle_get_constraints { table_name: "MFX_TRANSACTION" }
Agent: "Explain: SELECT * FROM mfx_transaction WHERE trans_date > SYSDATE - 7"
→ oracle_show_execution_plan { sql: "SELECT * FROM mfx_transaction WHERE trans_date > SYSDATE - 7" }Тестирование
npm test # unit: SQL guard (accept/reject matrix), identifiers, LIKE escaping
npm run typecheck # tsc --noEmit
npx tsx scripts/integration-check.ts # live smoke test (needs a DB; read-only)Модульные тесты намеренно сосредоточены на защитном механизме (security guard) — на наборе
принимаемых конструкций (SELECT/CTE, литералы, содержащие запрещённые слова, экранированные кавычки,
идентификаторы, похожие на ключевые слова) и наборе отклоняемых (DML/DDL, точки с запятой,
комментарии/подсказки, PL/SQL, опасные пакеты, q'…', превышение размера, нестроковые значения).
Устранение неполадок
Симптом | Причина / исправление |
| Instant Client не найден. Установите его и добавьте в |
| Неверная строка подключения / нет listener / неизвестный сервис. Используйте |
| Неверные |
| Учётной записи не хватает |
| SQL не является одиночным SELECT (или содержит точку с запятой/комментарий). Отправьте один чистый SELECT. |
Инструмент возвращает строки для нескольких схем | Имя объекта существует в нескольких видимых схемах. Укажите |
Агент не видит вывод, но в stderr есть логи | Это нормально — логи по замыслу идут в stderr; stdout несёт только протокол MCP. |
Сервер завершает работу сразу после запуска | Прочитайте строку в stderr — проверка конфигурации выводит, какая именно переменная окружения неверна (без секретов). |
Лицензия
MIT.
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
- AlicenseAqualityCmaintenanceEnables AI tools to interact with Oracle databases through query execution, schema browsing, stored procedure calls, and transaction management. Supports multiple database connections with safety features like read-only mode and dangerous query detection.16MIT
- FlicenseNot gradedqualityCmaintenanceEnables read-only SQL database access for AI assistants, allowing schema exploration and safe query execution without risk of data modification.
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to query SQL databases safely with read-only access, allowing schema discovery and SELECT queries while blocking writes and DDL operations.
- FlicenseNot gradedqualityBmaintenanceEnables read-only exploration of Oracle databases through natural language, providing schema inspection and safe bounded SQL query execution.
Related MCP Connectors
Read-only bank access for your AI agent. Connects Claude, ChatGPT, Cursor, Gemini, Codex.
Query PostgreSQL databases in plain English — LLM-generated, safety-validated SQL.
Read-only tools over the Safer Agentic AI framework: 238 patterns + 14 heuristics.
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/sharat9703/oracle-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server