Skip to main content
Glama

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.

Общие настройки

Переменная

По умолчанию

Описание

ORACLE_CLIENT_LIB_DIR

(из PATH)

Каталог Instant Client. Если не задано, определяется через PATH/LD_LIBRARY_PATH.

ORACLE_TNS_ADMIN

Каталог, содержащий tnsnames.ora/sqlnet.ora, если используется.

ORACLE_MAX_ROWS

1000

Жесткий предел строк, возвращаемых любым инструментом (также максимум, который может запросить вызывающий).

ORACLE_QUERY_TIMEOUT_MS

15000

Тайм-аут на оператор (в толстом режиме callTimeout).

ORACLE_POOL_MIN / _MAX / _INCREMENT

1 / 4 / 1

Размер пула соединений (для каждой базы данных).

ORACLE_POOL_TIMEOUT

60

Время простоя соединения (секунды).

ORACLE_DEFAULT_SCHEMA

Владелец по умолчанию для инструментов, ограниченных владельцем, если schema не указано.

LOG_LEVEL

info

error | warn | info | debug (журналы → stderr).


Подключение к агенту

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.

Инструмент

Ключевые параметры

Назначение

oracle_run_select

sql, maxRows?

Выполнить защищенный SELECT только для чтения.

oracle_show_execution_plan

sql

EXPLAIN PLAN + DBMS_XPLAN для SELECT (без обращения к данным).

oracle_list_schemas

Список владельцев/схем, видимых учетной записи.

oracle_list_tables

schema?, keyword?, limit?

Список таблиц (необязательно с фильтром).

oracle_search_tables

keyword

Таблицы, имена которых содержат ключевое слово.

oracle_find_table

table_name

Найти таблицу в схемах, включая синонимы.

oracle_describe_table

table_name, schema?

Столбцы + типы + допустимость NULL + комментарии.

oracle_search_columns

column_name

Столбцы, имена которых содержат ключевое слово (например, RISK).

oracle_find_column

column_name

Таблицы, имеющие столбец (сначала точные совпадения).

oracle_get_indexes

table_name

Индексы со столбцами, уникальностью, типом, статусом.

oracle_get_constraints

table_name

PK/FK/UK/CHECK со столбцами, ссылочной таблицей, правилом удаления.

oracle_find_triggers

table_name

Триггеры таблицы (время, событие, статус).

oracle_get_object_ddl

object_name, object_type?

Полный DDL CREATE через DBMS_METADATA.

oracle_get_view

view_name

DDL представления + список столбцов.

oracle_get_package_source

package_name

Исходный код спецификации пакета.

oracle_get_package_body

package_name

Исходный код тела пакета.

oracle_search_package

package_name

Поиск пакетов по ключевому слову в имени.

oracle_search_procedure

procedure_name

Поиск процедур/функций (автономных и в пакетах).

oracle_search_source

keyword, object_type?

Полнотекстовый поиск по всему исходному коду PL/SQL — ссылки и вызовы.

oracle_find_dependencies

object_name, direction?

used_by (вызывающие) или uses (используемые).

oracle_list_synonyms

schema?, keyword?, target_table?

Синонимы; target_table → "указывает на".

oracle_get_table_statistics

table_name

Количество строк, блоки, средняя длина строки, дата последнего анализа.

oracle_list_invalid_objects

schema?

Объекты в состоянии INVALID.

oracle_describe_object

object_name

Что такое объект (тип/владелец/статус) из ALL_OBJECTS.

Как общие вопросы сопоставляются с инструментами

Вопрос

Инструмент

Где определен MFX_GET_MARGIN?

oracle_search_procedureoracle_describe_object

Показать тело пакета

oracle_get_package_body

Найти все процедуры, вызывающие MFX_GET_MARGIN

oracle_find_dependencies (used_by) или oracle_search_source

Каждое упоминание mfx_transaction

oracle_search_source

Описать mfx_entity_master

oracle_describe_table

Столбцы, содержащие "risk"

oracle_search_columns

Индексы / внешние ключи / триггеры таблицы

oracle_get_indexes / oracle_get_constraints / oracle_find_triggers

Объяснить этот запрос

oracle_show_execution_plan

Синонимы, указывающие на таблицу

oracle_list_synonyms (target_table)

Недопустимые объекты

oracle_list_invalid_objects


Вопросы безопасности

Уровни защиты (эшелонированная оборона):

  1. Учётная запись только для чтения (основная стена). Предоставьте пользователю подключения только CREATE SESSION + SELECT на объектах (или ролях), которые он должен просматривать, а также SELECT_CATALOG_ROLE для словаря данных. MCP должен быть неспособен выполнять запись независимо от любых ошибок выше по стеку.

  2. 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) (классический вектор обхода);

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

  3. Переменные связывания (bind variables) для каждого имени объекта / ключевого слова в 23 инструментах работы с метаданными — пользовательский ввод является значением, а никогда не текстом SQL. Идентификаторы дополнительно проверяются на соответствие строгому набору символов.

  4. Ограничения — жёсткий лимит строк (ORACLE_MAX_ROWS), callTimeout на инструкцию, очистка ResultSet.

  5. Никакой утечки секретов — пароли никогда не логируются; логи идут только в 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'…', превышение размера, нестроковые значения).


Устранение неполадок

Симптом

Причина / исправление

DPI-1047: Cannot locate a 64-bit Oracle Client library

Instant Client не найден. Установите его и добавьте в PATH/LD_LIBRARY_PATH или задайте ORACLE_CLIENT_LIB_DIR.

ORA-12154 / ORA-12541 / ORA-12514

Неверная строка подключения / нет listener / неизвестный сервис. Используйте host:port/service (имя сервиса, а не SID) или действительный алиас tnsnames.

ORA-01017: invalid username/password

Неверные ORACLE_USER/ORACLE_PASSWORD.

[PERMISSION_DENIED] ORA-01031 или пустые результаты словаря

Учётной записи не хватает SELECT на объекте или SELECT_CATALOG_ROLE. Предоставьте доступ на чтение.

[VALIDATION_FAILURE] Only SELECT … permitted

SQL не является одиночным SELECT (или содержит точку с запятой/комментарий). Отправьте один чистый SELECT.

Инструмент возвращает строки для нескольких схем

Имя объекта существует в нескольких видимых схемах. Укажите schema (или задайте ORACLE_DEFAULT_SCHEMA) для ограничения области.

Агент не видит вывод, но в stderr есть логи

Это нормально — логи по замыслу идут в stderr; stdout несёт только протокол MCP.

Сервер завершает работу сразу после запуска

Прочитайте строку в stderr — проверка конфигурации выводит, какая именно переменная окружения неверна (без секретов).


Лицензия

MIT.

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    16
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only SQL database access for AI assistants, allowing schema exploration and safe query execution without risk of data modification.
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to query SQL databases safely with read-only access, allowing schema discovery and SELECT queries while blocking writes and DDL operations.
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables read-only exploration of Oracle databases through natural language, providing schema inspection and safe bounded SQL query execution.

View all related MCP servers

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.

View all MCP Connectors

Latest Blog Posts

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