oracle-mcp
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 별칭을 사용하십시오.
공유 설정
변수 | 기본값 | 설명 |
| (PATH에서) | Instant Client 디렉터리. 설정하지 않으면 PATH/LD_LIBRARY_PATH를 통해 검색. |
| — | 사용 중인 경우 |
|
| 도구가 반환하는 최대 행 수(호출자가 요청할 수 있는 최대값이기도 함). |
|
| 명령문별 제한 시간(두꺼운 모드 |
|
| 연결 풀 크기(데이터베이스별). |
|
| 유휴 연결 정리(초). |
| — |
|
|
|
|
에이전트에 연결
oracle-mcp는 stdio를 통해 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로 지정할 수 있습니다.
도구 | 주요 매개변수 | 용도 |
|
| 보호된 읽기 전용 SELECT를 실행합니다. |
|
| SELECT에 대한 EXPLAIN PLAN + DBMS_XPLAN (데이터 미접촉). |
| — | 계정에 표시되는 소유자/스키마를 나열합니다. |
|
| 테이블을 나열합니다(선택적으로 필터링). |
|
| 이름에 키워드가 포함된 테이블을 검색합니다. |
|
| 동의어를 포함하여 스키마 전반에서 테이블을 찾습니다. |
|
| 열 + 유형 + null 허용 여부 + 주석. |
|
| 이름에 키워드가 포함된 열을 검색합니다(예: |
|
| 열이 있는 테이블을 찾습니다(정확히 일치하는 항목이 먼저). |
|
| 열, 고유성, 유형, 상태가 포함된 인덱스. |
|
| 열, 참조 테이블, 삭제 규칙이 포함된 PK/FK/UK/CHECK. |
|
| 테이블의 트리거(시기, 이벤트, 상태). |
|
|
|
|
| 뷰 DDL + 열 목록. |
|
| 패키지 명세 소스. |
|
| 패키지 본문 소스. |
|
| 이름 키워드로 패키지를 찾습니다. |
|
| 프로시저/함수(독립 실행형 및 패키지)를 찾습니다. |
|
| 모든 PL/SQL 소스의 전체 텍스트 검색 - 참조 및 호출자. |
|
|
|
|
| 동의어; |
|
| 행 수, 블록, 평균 행 길이, 마지막 분석 시각. |
|
|
|
|
|
|
일반적인 질문을 도구에 매핑하는 방법
질문 | 도구 |
|
|
패키지 본문 표시 |
|
|
|
|
|
|
|
"risk"를 포함하는 열 |
|
테이블의 인덱스 / FK / 트리거 |
|
이 쿼리 설명 |
|
테이블을 가리키는 동의어 |
|
잘못된 객체 |
|
보안 고려 사항
계층(심층 방어):
읽기 전용 계정(1차 방어선). 연결 사용자에게 검사해야 하는 객체(또는 역할)에 대한
CREATE SESSION+SELECT만 부여하고, 데이터 딕셔너리용SELECT_CATALOG_ROLE도 부여합니다. MCP는 그 위의 어떤 버그와 무관하게 쓰기가 불가능해야 합니다.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, …);세미콜론 / 다중 문장, 그리고 모든 주석/힌트(전형적인 우회 경로);
문자열 리터럴 내용을 공백 처리한 코드 전용 프로젝션을 분석하므로, 리터럴 안에 숨겨진 키워드나 세미콜론은 오탐을 유발하지도 않고 두 번째 문장을 몰래 실어 보낼 수도 없습니다.
바인드 변수 — 23개 메타데이터 도구의 모든 객체 이름/키워드에 적용됩니다. 사용자 입력은 값이지 SQL 텍스트가 아닙니다. 식별자는 추가로 엄격한 문자 집합에 대해 검증됩니다.
상한 — 하드 행 상한(
ORACLE_MAX_ROWS), 문장별callTimeout, ResultSet 정리.비밀 정보 유출 없음 — 비밀번호는 절대 로그에 남지 않습니다. 로그는 stderr로만 출력됩니다(stdout은 MCP 채널). SQL은 로그에서 길이가 제한됩니다.
참고 사항
oracle_show_execution_plan은EXPLAIN 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'…', 크기 초과, 비문자열)입니다.
문제 해결
증상 | 원인 / 해결 방법 |
| Instant Client를 찾을 수 없습니다. 설치하고 |
| 잘못된 연결 문자열 / 리스너 없음 / 알 수 없는 서비스. |
|
|
| 계정에 객체에 대한 |
| 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