Skip to main content
Glama

oracle-mcp

Model Context Protocol읽기 전용 Oracle Database 서버입니다. AI 에이전트(Claude Desktop, Claude Code, Cursor, VS Code agents, OpenAI Agents 등)가 수천 개의 테이블, 수백 개의 패키지, 뷰, 동의어, 트리거, 시퀀스, PL/SQL 소스를 포함한 대규모 레거시 Oracle 스키마를 데이터를 절대 수정하지 않고 안전하게 검사할 수 있게 해줍니다.

기존 "엔지니어링 MCP"(GitLab / Redmine / Taiga / ERPNext)와 함께 실행되는 독립 실행형 모듈로 설계되었습니다. 하나의 에이전트, 여러 MCP 서버.

한 줄 요약 보안 모델: 서버는 오직 SELECT 및 데이터 사전 읽기만 실행하며, 모든 객체 이름은 바인드 변수로 전달되고, 자유 형식 SQL은 실패 시 차단되는 읽기 전용 가드에 의해 검사되며, 데이터베이스 계정 자체도 읽기 전용으로 부여되어야 합니다. 단일 게이트가 아닌 심층 방어입니다.


목차


Related MCP server: safe-sql-mcp

기능

  • 24가지의 집중적인 도구 - 검색, 설명, DDL, 소스, 종속성, 인덱스, 제약 조건, 트리거, 동의어, 통계, 잘못된 객체 및 보호된 SELECT 실행을 다룹니다.

  • 구조적으로 읽기 전용 - 주석이 없는 단일 SELECT / WITH … SELECT를 제외한 모든 것을 거부하는 SQL 가드.

  • 모든 곳에 바인드 변수 사용 - 객체 이름과 키워드는 SQL에 절대 연결되지 않습니다.

  • 제한적이고 안전함 - 하드 행 제한(기본 1000개), 명령문별 제한 시간, ResultSet 정리.

  • 연결 풀링 및 투명한 재연결(두꺼운 모드 / Oracle Instant Client).

  • 구조화된 로깅을 stderr로 출력(타임스탬프, 도구, 경과 시간, 행 수, 스키마, SQL) - 비밀번호는 절대 기록하지 않음.

  • 유형화된 오류 분류 - 연결 / 검증 / 잘못된 SQL / 권한 / 찾을 수 없음 / 시간 초과 / oracle.

  • 강력한 형식 지정(TypeScript strict) 및 테스트됨(가드 및 헬퍼에 대한 단위 테스트 48개).


요구 사항

  • Node.js ≥ 18

  • Oracle Instant Client가 설치되어 라이브러리 경로에 있어야 합니다(이 빌드는 oracledb thick mode 사용).

    • Windows: PATH에 Instant Client 폴더.

    • 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_<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 별칭을 사용하십시오.

공유 설정

변수

기본값

설명

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-mcpstdio를 통해 MCP를 사용합니다. 엔지니어링 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(gitignored)에 있습니다. Oracle을 자체 서버에 유지하면(JS 엔지니어링 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

이러한 선택의 이유

  • JS 엔지니어링 MCP에 병합하지 않고 독립 실행형 TS 패키지 - 보안에 민감한 표면을 격리하고, 엄격한 형식의 빌드와 독립적인 배포/권한 부여를 가능하게 합니다.

  • Thick 모드 - 이 배포를 위해 선택됨(Instant Client 있음). 가장 넓은 드라이버 기능 세트를 가능하게 합니다. 원하는 경우 thin 모드로 클라이언트 종속성을 제거할 수 있습니다.

  • 선언적 메타데이터 도구 - 20개의 사전 도구가 하나의 안전한 형태(고정 SQL + 바인드 + 형식)를 공유하므로 도구 추가는 몇 줄이면 되고 보안 속성도 균일합니다.

  • 단일 OracleClient 병목 지점 - 모든 쿼리가 이 지점을 통과하므로 제한 시간, 행 제한, 정리, 오류 매핑 및 로깅이 정확히 한 곳에서 적용됩니다.


도구 참조

모든 도구에는 oracle_ 접두사가 붙습니다. 소유자 범위 도구는 선택적 schema를 허용하고, 검색 도구는 선택적 limit(ORACLE_MAX_ROWS로 제한됨)를 허용합니다. 이름은 OBJECT 또는 SCHEMA.OBJECT로 지정할 수 있습니다.

도구

주요 매개변수

용도

oracle_run_select

sql, maxRows?

보호된 읽기 전용 SELECT를 실행합니다.

oracle_show_execution_plan

sql

SELECT에 대한 EXPLAIN PLAN + DBMS_XPLAN (데이터 미접촉).

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?

DBMS_METADATA를 통한 전체 CREATE DDL.

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

테이블의 인덱스 / FK / 트리거

oracle_get_indexes / oracle_get_constraints / oracle_find_triggers

이 쿼리 설명

oracle_show_execution_plan

테이블을 가리키는 동의어

oracle_list_synonyms (target_table)

잘못된 객체

oracle_list_invalid_objects


보안 고려 사항

계층(심층 방어):

  1. 읽기 전용 계정(1차 방어선). 연결 사용자에게 검사해야 하는 객체(또는 역할)에 대한 CREATE SESSION + SELECT만 부여하고, 데이터 딕셔너리용 SELECT_CATALOG_ROLE도 부여합니다. MCP는 그 위의 어떤 버그와 무관하게 쓰기가 불가능해야 합니다.

  2. SQL 가드(validation/sqlGuard.ts) — 자유 형식 도구(oracle_run_select) 하나를 위한 것으로, 기본적으로 차단(fail closed) 방식이며 다음을 거부합니다:

    • 단일 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, …);

    • 세미콜론 / 다중 문장, 그리고 모든 주석/힌트(전형적인 우회 경로);

    • 문자열 리터럴 내용을 공백 처리한 코드 전용 프로젝션을 분석하므로, 리터럴 안에 숨겨진 키워드나 세미콜론은 오탐을 유발하지도 않고 두 번째 문장을 몰래 실어 보낼 수도 없습니다.

  3. 바인드 변수 — 23개 메타데이터 도구의 모든 객체 이름/키워드에 적용됩니다. 사용자 입력은 이지 SQL 텍스트가 아닙니다. 식별자는 추가로 엄격한 문자 집합에 대해 검증됩니다.

  4. 상한 — 하드 행 상한(ORACLE_MAX_ROWS), 문장별 callTimeout, ResultSet 정리.

  5. 비밀 정보 유출 없음 — 비밀번호는 절대 로그에 남지 않습니다. 로그는 stderr로만 출력됩니다(stdout은 MCP 채널). SQL은 로그에서 길이가 제한됩니다.

참고 사항

  • oracle_show_execution_planEXPLAIN PLAN을 실행하며, 이는 세션 전용 전역 임시 PLAN_TABLE에 기록합니다. 이는 임시 메타데이터로, 자동으로 폐기되며 읽기 전용 계정에서도 사용할 수 있습니다 — 운영 데이터는 읽거나 쓰지 않습니다.

  • 가드는 의도적으로 엄격합니다. 전용 메타데이터 도구가 있다면 oracle_run_select보다 그 도구를 우선 사용하세요. 드물게 발생하는 오탐(예: 비예약 키워드와 똑같은 이름의 컬럼)은 별칭(alias)으로 우회할 수 있습니다.


예시

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'…', 크기 초과, 비문자열)입니다.


문제 해결

증상

원인 / 해결 방법

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

잘못된 연결 문자열 / 리스너 없음 / 알 수 없는 서비스. 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