Skip to main content
Glama

oracle-mcp

Ein schreibgeschützter Oracle-Datenbankserver für das Model Context Protocol. Er ermöglicht es KI-Agenten (Claude Desktop, Claude Code, Cursor, VS Code agents, OpenAI Agents, …), große Legacy-Oracle-Schemata sicher zu untersuchen — Tausende von Tabellen, Hunderte von Packages, Views, Synonyme, Trigger, Sequenzen und PL/SQL-Quellcode — ohne jemals Daten zu verändern.

Er ist als eigenständiges Modul konzipiert, das neben einem bestehenden „Engineering MCP“ (GitLab / Redmine / Taiga / ERPNext) läuft: ein Agent, mehrere MCP-Server.

Sicherheitsmodell in einem Satz: Der Server führt ausschließlich SELECT- und Data-Dictionary-Lesezugriffe aus, jeder Objektname wird als Bind-Variable übergeben, frei formuliertes SQL wird durch eine fail-closed Read-only-Wache geprüft, und das Datenbankkonto selbst sollte nur Leseberechtigung erhalten. Tiefenverteidigung, nicht ein einzelnes Tor.


Inhaltsverzeichnis


Related MCP server: safe-sql-mcp

Funktionen

  • 24 gezielte Tools für Suche, Beschreibung, DDL, Quellcode, Abhängigkeiten, Indizes, Constraints, Trigger, Synonyme, Statistiken, ungültige Objekte und abgesicherte SELECT-Ausführung.

  • Konstruktionsbedingt schreibgeschützt – eine SQL-Wache, die alles ablehnt außer einem einzigen, kommentarfreien SELECT / WITH … SELECT.

  • Überall Bind-Variablen – Objektnamen und Schlüsselwörter werden niemals in SQL verkettet.

  • Begrenzt und sicher – harte Zeilenobergrenze (Standard 1000), Timeout pro Statement, ResultSet-Bereinigung.

  • Connection-Pooling mit transparentem Wiederverbinden (Thick Mode / Oracle Instant Client).

  • Strukturierte Protokollierung auf stderr (Zeitstempel, Tool, verstrichene Zeit, Zeilen, Schema, SQL) – niemals Geheimnisse.

  • Typisierte Fehler-Taxonomie – Verbindungs-/Validierungs-/ungültiges-SQL-/Berechtigungs-/Nicht-gefunden-/ Timeout-/Oracle-Fehler.

  • Streng typisiert (TypeScript strict) und getestet (48 Unit-Tests für die Wache und Helfer).


Anforderungen

  • Node.js ≥ 18

  • Oracle Instant Client installiert und im Bibliothekspfad (dieser Build verwendet oracledb im Thick Mode).

    • Windows: der Instant-Client-Ordner in PATH.

    • Linux/macOS: in LD_LIBRARY_PATH / DYLD_LIBRARY_PATH, oder ORACLE_CLIENT_LIB_DIR setzen.

  • Netzwerkzugriff auf die Datenbank und ein schreibgeschütztes Oracle-Konto (siehe Sicherheitshinweise).


Installation

git clone <your-repo>/oracle-mcp.git
cd oracle-mcp
npm install
npm run build          # compiles src/ → dist/

Ohne Datenbank verifizieren:

npm test               # 48 unit tests (SQL guard, identifiers, formatting)

Smoke-Test gegen eine echte Datenbank (schreibgeschützt):

ORACLE_USER=... ORACLE_PASSWORD=... ORACLE_CONNECT_STRING=host:port/service \
  npx tsx scripts/integration-check.ts

Konfiguration

Die Konfiguration erfolgt über Umgebungsvariablen. Der Server lädt automatisch eine .env-Datei aus seinem eigenen Paketverzeichnis (kopieren Sie .env.example.env), sodass Geheimnisse neben dem Server und außerhalb Ihrer Agentenkonfiguration liegen. Die Konfiguration wird beim Start validiert; der Server bricht schnell mit einer lesbaren, geheimnisfreien Meldung ab, wenn etwas fehlt.

Datenbanken (eine oder mehrere)

Der Server kann mehrere Oracle-Datenbanken gleichzeitig untersuchen. Jedes Tool akzeptiert ein optionales database-Argument; wenn es weggelassen wird, wird die Standarddatenbank verwendet.

Einzelne Datenbank:

ORACLE_USER="readonly_user"
ORACLE_PASSWORD="change_me"
ORACLE_CONNECT_STRING="host:port/service"

Mehrere Datenbanken – Namen auflisten, dann pro Namen Variablen mit dem Präfix ORACLE_<NAME>_ angeben (Name in Großbuchstaben, Nicht-Alphanumerisches → _):

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"

Pools werden lazy pro Datenbank erstellt – zehn zu konfigurieren kostet nichts, bis sie abgefragt werden. Umgeben Sie Passwörter mit doppelten Anführungszeichen, damit $/# wörtlich genommen werden.

Connect-String-Tipp: Verwenden Sie für eine PDB die Service-Name-Form host:port/service. Die ältere Form host:port:SID ist nicht Easy Connect – konvertieren Sie sie (…:port/service) oder nutzen Sie einen tnsnames-Alias.

Gemeinsame Einstellungen

Variable

Standard

Beschreibung

ORACLE_CLIENT_LIB_DIR

(aus PATH)

Instant-Client-Verzeichnis. Falls nicht gesetzt, wird es über PATH/LD_LIBRARY_PATH gefunden.

ORACLE_TNS_ADMIN

Verzeichnis mit tnsnames.ora/sqlnet.ora, falls verwendet.

ORACLE_MAX_ROWS

1000

Harte Obergrenze für Zeilen, die ein Tool zurückgibt (auch das Maximum, das ein Aufrufer anfordern darf).

ORACLE_QUERY_TIMEOUT_MS

15000

Timeout pro Statement (Thick-Mode-callTimeout).

ORACLE_POOL_MIN / _MAX / _INCREMENT

1 / 4 / 1

Größe des Connection-Pools (pro Datenbank).

ORACLE_POOL_TIMEOUT

60

Abbau von Leerlaufverbindungen (Sekunden).

ORACLE_DEFAULT_SCHEMA

Standard-Owner für owner-bezogene Tools, wenn schema weggelassen wird.

LOG_LEVEL

info

error | warn | info | debug (Protokolle → stderr).


Einbindung in einen Agenten

oracle-mcp spricht MCP über stdio. Fügen Sie es neben Ihrem Engineering MCP hinzu.

Claude Desktop / Claude Code (claude_desktop_config.json / .mcp.json) — hier keine Geheimnisse; der Server liest seine eigene .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"
    }
  }
}

Anmeldedaten liegen in oracle-mcp/.env (gitignored), nicht in der Agentenkonfiguration. Oracle in einem eigenen Server zu halten (anstatt es in das JS Engineering MCP zu integrieren) isoliert die sicherheitskritische Datenbankoberfläche und ermöglicht eine unabhängige Berechtigungsvergabe und Bereitstellung.


Architektur

                        ┌──────────────────────────────────────────────┐
   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)

Ordnerstruktur

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

Warum diese Entscheidungen

  • Eigenständiges TS-Paket, nicht in das JS Engineering MCP integriert – isoliert eine sicherheitskritische Oberfläche, ermöglicht einen streng typisierten Build sowie unabhängige Bereitstellung/Rechtevergabe.

  • Thick Mode – gewählt für dieses Deployment (Instant Client vorhanden); ermöglicht den breitesten Funktionsumfang des Treibers. Thin Mode würde die Client-Abhängigkeit entfernen, falls dies jemals gewünscht ist.

  • Deklarative Metadaten-Tools – die 20 Wörterbuch-Tools teilen sich eine sichere Form (festes SQL + Binds + Format), sodass das Hinzufügen eines Tools nur wenige Zeilen umfasst und die Sicherheitseigenschaften einheitlich sind.

  • Ein OracleClient-Engpass – jede Abfrage fließt durch ihn, sodass Timeout, Zeilenobergrenze, Bereinigung, Fehlerzuordnung und Protokollierung an genau einer Stelle erzwungen werden.


Tool-Referenz

Alle Tools tragen das Präfix oracle_. Owner-bezogene Tools akzeptieren ein optionales schema; Suchtools akzeptieren ein optionales limit (auf ORACLE_MAX_ROWS begrenzt). Namen können als OBJECT oder SCHEMA.OBJECT angegeben werden.

Tool

Wichtige Parameter

Zweck

oracle_run_select

sql, maxRows?

Führt ein abgesichertes schreibgeschütztes SELECT aus.

oracle_show_execution_plan

sql

EXPLAIN PLAN + DBMS_XPLAN für ein SELECT (keine Daten werden berührt).

oracle_list_schemas

Listet die für das Konto sichtbaren Owner/Schemata auf.

oracle_list_tables

schema?, keyword?, limit?

Listet Tabellen auf (optional gefiltert).

oracle_search_tables

keyword

Tabellen, deren Name ein Schlüsselwort enthält.

oracle_find_table

table_name

Findet eine Tabelle über Schemata hinweg, einschließlich Synonymen.

oracle_describe_table

table_name, schema?

Spalten + Typen + Nullability + Kommentare.

oracle_search_columns

column_name

Spalten, deren Name ein Schlüsselwort enthält (z. B. RISK).

oracle_find_column

column_name

Tabellen, die eine Spalte besitzen (exakte Treffer zuerst).

oracle_get_indexes

table_name

Indizes mit Spalten, Eindeutigkeit, Typ, Status.

oracle_get_constraints

table_name

PK/FK/UK/CHECK mit Spalten, Referenztabelle, Löschregel.

oracle_find_triggers

table_name

Trigger auf einer Tabelle (Timing, Ereignis, Status).

oracle_get_object_ddl

object_name, object_type?

Vollständiges CREATE-DDL über DBMS_METADATA.

oracle_get_view

view_name

View-DDL + Spaltenliste.

oracle_get_package_source

package_name

Quellcode der Package-Spezifikation.

oracle_get_package_body

package_name

Quellcode des Package-Body.

oracle_search_package

package_name

Findet Packages anhand eines Namens-Schlüsselworts.

oracle_search_procedure

procedure_name

Findet Prozeduren/Funktionen (eigenständig und in Packages).

oracle_search_source

keyword, object_type?

Volltextsuche im gesamten PL/SQL-Quellcode – Referenzen & Aufrufer.

oracle_find_dependencies

object_name, direction?

used_by (Aufrufer) oder uses (referenziert).

oracle_list_synonyms

schema?, keyword?, target_table?

Synonyme; target_table → „zeigt auf“.

oracle_get_table_statistics

table_name

Zeilenanzahl, Blöcke, durchschnittliche Zeilenlänge, letzte Analyse.

oracle_list_invalid_objects

schema?

Objekte im Zustand INVALID.

oracle_describe_object

object_name

Was ein Objekt ist (Typ/Owner/Status) aus ALL_OBJECTS.

Wie häufige Fragen auf Tools abgebildet werden

Frage

Tool

Wo ist MFX_GET_MARGIN definiert?

oracle_search_procedureoracle_describe_object

Package-Body anzeigen

oracle_get_package_body

Alle Prozeduren finden, die MFX_GET_MARGIN aufrufen

oracle_find_dependencies (used_by) oder oracle_search_source

Jede Referenz auf mfx_transaction

oracle_search_source

mfx_entity_master beschreiben

oracle_describe_table

Spalten, die „risk“ enthalten

oracle_search_columns

Indizes / FKs / Trigger auf einer Tabelle

oracle_get_indexes / oracle_get_constraints / oracle_find_triggers

Diese Abfrage erklären

oracle_show_execution_plan

Synonyme, die auf eine Tabelle zeigen

oracle_list_synonyms (target_table)

Ungültige Objekte

oracle_list_invalid_objects


Sicherheitshinweise

Ebenen (Verteidigung in der Tiefe):

  1. Nur-Lese-Konto (primäre Mauer). Gewähren Sie dem Verbindungsbenutzer nur CREATE SESSION + SELECT auf die Objekte (oder Rollen), die er prüfen muss, plus SELECT_CATALOG_ROLE für das Datenwörterbuch. Das MCP sollte nicht in der Lage sein, zu schreiben, unabhängig von etwaigen Fehlern darüber.

  2. SQL-Wächter (validation/sqlGuard.ts) für das eine Freiform-Tool (oracle_run_select) — er fällt geschlossen aus und lehnt ab:

    • alles, was kein einzelnes SELECT / WITH … SELECT ist;

    • INSERT/UPDATE/DELETE/MERGE/…, alle DDL, GRANT/REVOKE, COMMIT/ROLLBACK;

    • PL/SQL-Blöcke (BEGIN/DECLARE), CALL, EXECUTE [IMMEDIATE], SELECT … INTO, FOR UPDATE;

    • gefährliche Pakete (DBMS_SQL, DBMS_SCHEDULER, DBMS_JOB, UTL_FILE, UTL_HTTP, …);

    • Semikolons / mehrere Anweisungen und alle Kommentare/Hinweise (ein klassischer Bypass-Vektor);

    • es analysiert eine nur-Code-Projektion mit geleerten String-Literal-Inhalten, sodass Schlüsselwörter oder Semikolons, die in Literalen versteckt sind, weder falsch auslösen noch eine zweite Anweisung einschmuggeln können.

  3. Bind-Variablen für jeden Objektnamen / jedes Schlüsselwort in den 23 Metadaten-Tools — Benutzereingaben sind ein Wert, niemals SQL-Text. Bezeichner werden zusätzlich gegen einen strengen Zeichensatz validiert.

  4. Grenzen — harte Zeilenobergrenze (ORACLE_MAX_ROWS), callTimeout pro Anweisung, ResultSet-Bereinigung.

  5. Kein Geheimnis-Leck — Passwörter werden nie protokolliert; Logs gehen nur an stderr (stdout ist der MCP-Kanal); SQL wird in Logs auf eine Länge begrenzt.

Hinweise

  • oracle_show_execution_plan führt EXPLAIN PLAN aus, das in die sitzungsprivate globale temporäre PLAN_TABLE schreibt. Das sind temporäre Metadaten, die automatisch verworfen werden und auch für Nur-Lese-Konten verfügbar sind — es werden keine Produktionsdaten gelesen oder geschrieben.

  • Der Wächter ist absichtlich streng; bevorzugen Sie ein dediziertes Metadaten-Tool gegenüber oracle_run_select, wenn eines existiert. Ein seltener Fehlalarm (z. B. eine Spalte, die wörtlich nach einem nicht reservierten Schlüsselwort benannt ist) kann mit einem Alias umgangen werden.


Beispiele

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" }

Tests

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)

Die Unit-Tests konzentrieren sich bewusst auf den Sicherheitswächter — die Akzeptanzmenge (SELECT/CTE, Literale mit verbotenen Wörtern, escaped quotes, Bezeichner nahe an Schlüsselwörtern) und die Ablehnungsmenge (DML/DDL, Semikolons, Kommentare/Hinweise, PL/SQL, gefährliche Pakete, q'…', Überlänge, Nicht-String).


Fehlerbehebung

Symptom

Ursache / Lösung

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

Instant Client nicht gefunden. Installieren Sie ihn und setzen Sie ihn auf PATH/LD_LIBRARY_PATH, oder setzen Sie ORACLE_CLIENT_LIB_DIR.

ORA-12154 / ORA-12541 / ORA-12514

Falsche Verbindungszeichenfolge / kein Listener / unbekannter Dienst. Verwenden Sie host:port/service (Dienstname, nicht SID) oder einen gültigen tnsnames-Alias.

ORA-01017: invalid username/password

Falsches ORACLE_USER/ORACLE_PASSWORD.

[PERMISSION_DENIED] ORA-01031 oder leere Wörterbuch-Ergebnisse

Dem Konto fehlt SELECT auf das Objekt oder SELECT_CATALOG_ROLE. Gewähren Sie Lesezugriff.

[VALIDATION_FAILURE] Only SELECT … permitted

Das SQL ist kein einzelnes SELECT (oder enthält ein Semikolon/einen Kommentar). Senden Sie ein sauberes SELECT.

Tool gibt Zeilen für mehrere Schemas zurück

Der Objektname existiert in mehreren sichtbaren Schemas. Übergeben Sie schema (oder setzen Sie ORACLE_DEFAULT_SCHEMA), um den Bereich einzugrenzen.

Agent sieht keine Ausgabe, aber stderr hat Logs

Richtig — Logs gehen standardmäßig an stderr; stdout trägt nur das MCP-Protokoll.

Server beendet sich sofort beim Start

Lesen Sie die stderr-Zeile — die Konfigurationsvalidierung gibt genau an, welche Umgebungsvariable falsch ist (keine Geheimnisse).


Lizenz

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