oracle-mcp
oracle-mcp
読み取り専用の Oracle Database サーバーです。Model Context Protocol 向けに設計されており、AI エージェント(Claude Desktop、Claude Code、Cursor、VS Code エージェント、OpenAI Agents、…)が、数千のテーブル、数百のパッケージ、ビュー、シノニム、トリガー、シーケンス、PL/SQL ソースからなる大規模なレガシー Oracle スキーマを、データを一切変更せずに安全に調査できるようにします。
これは既存の「Engineering MCP」(GitLab / Redmine / Taiga / ERPNext)と並んで動作する独立モジュールとして設計されています。エージェント 1 つに対して MCP サーバーを複数使う構成です。
セキュリティモデルを一言で言えば: サーバーは
SELECTとデータディクショナリの読み取りしか発行しません。すべてのオブジェクト名はバインド変数として渡され、自由形式の SQL はフェイルクローズの 読み取り専用ガード で検査され、さらにデータベースアカウント自体も読み取り専用にしておくべきです。単一のゲートではなく、多層防御です。
目次
Related MCP server: safe-sql-mcp
特徴
24 個の機能不能 — 検索、説明、DDL、ソース、依存関係、インデックス、制約、トリガー、シノニム、統計、無効オブジェクト、ガード付き
SELECT実行をカバーします。構造的に読み取り専用 — コメントを含まない単一の
SELECT/WITH … SELECT以外をすべて拒否する SQL ガード。どこでもバインド変数 — オブジェクト名やキーワードが SQL に連結されることはありません。
上限付きで安全 — 行数のハード上限(デフォルト 1000)、ステートメント単位のタイムアウト、ResultSet のクリーンアップを備えています。
コネクションプールと自動再接続(シックモード / Oracle Instant Client)。
構造化ログを stderr に出力(タイムスタンプ、ツール、経過時間、行数、スキーマ、SQL)— シークレットは含めません。
型付きエラー分類 — connection / validation / invalid-SQL / permission / not-found / timeout / 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 にコピーします)。これによりシークレットはエージェント設定の外で、サーバーと同じ場所に置かれます。設定は起動時に検証され、不足があれば、可読性が高くシークレットを含まないメッセージでフォールクローズします。
データベース(1 つまたは複数)
サーバーは複数の Oracle データベースを同時に調査できます。すべてのツールは省略可能な database 引数を受け付け、省略時はデフォルトを使います。
単一データベース:
ORACLE_USER="readonly_user"
ORACLE_PASSWORD="change_me"
ORACLE_CONNECT_STRING="host:port/service"複数データベース — 名前をリストし、接頭辞 ORACLE_<NAME>_ を持つ名前別の変数を指定します(名前は大文字化され、英数字以外は _ になります):
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"プールはデータベースごとに遅延作成されます。プールを 10 個設定しても、クエリを実行するまでコストはかかりません。$ や # を文字どおり扱うため、パスワードは二重引用符で囲んでください。
接続文字列のヒント: PDB にはサービス名形式
host:port/serviceを使ってください。古いhost:port:SID形式は Easy Connect ではないため、…:port/serviceのように変換するか、tnsnames エイリアスを使ってください。
共有設定
変数 | デフォルト | 説明 |
| (PATH から) | Instant Client の場所。未設定の場合は PATH / LD_LIBRARY_PATH から検出します。 |
| — | 使用する場合の |
|
| どのツールでも返せる行数のハード上限(呼び出し側が要求できる最大値でもあります)。 |
|
| 文ごとのタイムアウト(シックモードの |
|
| 接続プールのサイズ(データベースごと)。 |
|
| アイドル接続の整理(秒単位)。 |
| — |
|
|
|
|
エージェントへの組み込み
oracle-mcp は stdio で MCP を話します。既存の 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なぜこの選択か
Standalone TS パッケージ(JS の Engineering MCP に統合しない) — セキュリティに敏感な領域を分離し、厳密な型チェックでビルドできるとともに、独立したデプロイと権限付与を可能にします。
シックモード — この環境では Instant Client が存在するため、この方式を採用しています。最も広いドライバ機能を有効にできます。必要になればシンモードにすればクライアント依存を減らせます。
宣言型メタデータツール — 20 個のディクショナリツールは単一の安全な形(固定 SQL + バインド変数 + 出力形式)を共有するため、ツールの追加は数行で済み、セキュリティ特性も揃います。
OracleClientひとつの経路に集約 — すべてのクエリがここを通過するため、タイムアウト、行上限、クリーンアップ、エラーマッピング、ログが一か所で強制されます。
ツールリファレンス
すべてのツールは oracle_ プリフィックスを持ちます。オーナースコープのツールは省略可能な schema を受け付けます。検索ツールは省略可能な limit を受け付けます(ORACLE_MAX_ROWS に切り詰められます)。名前は OBJECT または SCHEMA.OBJECT の形で指定できます。
ツール | 主なパラメータ | 説明 |
|
| ガード付きの読み取り専用 SELECT を実行します。 |
|
| SELECT の EXPLAIN PLAN + DBMS_XPLAN(データには触れません)。 |
| — | アカウントから見えるオーナー / スキーマを列挙します。 |
|
| テーブルを一覧表示します(フィルター可能)。 |
|
| 名前にキーワードを含むテーブルを見つけます。 |
|
| スキーマをまたいでテーブルを探します(シノニムを含む)。 |
|
| 列、型、NULL 許容、コメントを表示します。 |
|
| 列名にキーワードを含む列を検索します(例: |
|
| その列を持つテーブルを探します(完全一致を優先)。 |
|
| 列、一意性、種類、状態を含むインデックスを取得します。 |
|
| PK/FK/UK/CHECK 制約を、列、参照テーブル、削除規則とともに取得します。 |
|
| テーブル上のトリガー(タイミング、イベント、状態)を見つけます。 |
|
|
|
|
| ビューの DDL と列リストを取得します。 |
|
| パッケージの**仕様(spec)**ソースを取得します。 |
|
| パッケージの**本体(body)**ソースを取得します。 |
|
| 名前のキーワードでパッケージを検索します。 |
|
| プロシージャ・ファンクションを検索します(スタンドアロンとパッケージ内の両方)。 |
|
| すべての 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、…);セミコロン / 複数ステートメント、およびすべてのコメント/ヒント(古典的なバイパス経路);
文字列リテラルの内容をブランクにしたコードのみの射影を解析するため、リテラル内に隠されたキーワードやセミコロンは、誤検知を引き起こすことも、2 番目のステートメントを紛れ込ませることもできません。
バインド変数 — 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)単体テストは意図的にセキュリティガードに集中しています — 受理セット(SELECT/CTE、禁止語を含むリテラル、エスケープされた引用符、キーワードに類似した識別子)と拒否セット(DML/DDL、セミコロン、コメント/ヒント、PL/SQL、危険なパッケージ、q'…'、サイズ超過、非文字列)です。
トラブルシューティング
症状 | 原因 / 修正 |
| Instant Client が見つかりません。インストールして |
| 接続文字列の誤り / リスナーなし / サービス不明。 |
|
|
| アカウントにオブジェクトへの |
| SQL が単独の SELECT ではありません(またはセミコロン/コメントを含みます)。クリーンな SELECT を 1 つ送信してください。 |
ツールが複数のスキーマの行を返す | オブジェクト名が複数の可視スキーマに存在します。 |
エージェントに出力が見えないが 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