oracle-mcp
oracle-mcp
一个面向 Model Context Protocol 的只读 Oracle 数据库服务器。 它让 AI 代理(Claude Desktop、Claude Code、Cursor、VS Code 代理、OpenAI Agents 等)能够安全地 检查大型遗留 Oracle 模式——数千张表、数百个包、视图、同义词、 触发器、序列和 PL/SQL 源码——而绝不修改数据。
它被设计为一个独立模块,与现有的"工程 MCP"(GitLab / Redmine / Taiga / ERPNext)并行运行:一个代理,多个 MCP 服务器。
安全模型一句话总结: 服务器只发出
SELECT和数据字典读取,每个 对象名都作为绑定变量传递,自由格式 SQL 由故障关闭式 只读守卫检查,数据库账户本身应被授予 只读权限。纵深防御,而非单一闸门。
目录
Related MCP server: safe-sql-mcp
功能特性
24 个聚焦工具,涵盖搜索、描述、DDL、源码、依赖、索引、约束、 触发器、同义词、统计信息、无效对象以及受守卫保护的
SELECT执行。构造上即只读——SQL 守卫拒绝除单一、无注释的
SELECT/WITH … SELECT之外的一切。处处使用绑定变量——对象名和关键字从不拼接进 SQL。
有界且安全——硬性行数上限(默认 1000)、每条语句超时、ResultSet 清理。
连接池,支持透明重连(thick 模式 / Oracle Instant Client)。
结构化日志输出到 stderr(时间戳、工具、耗时、行数、模式、SQL)——绝不记录机密。
类型化错误分类——连接 / 校验 / 非法 SQL / 权限 / 未找到 / 超时 / oracle。
强类型(TypeScript strict)且经过测试(守卫与辅助函数共 48 个单元测试)。
环境要求
Node.js ≥ 18
已安装 Oracle Instant Client 并在库路径上(此构建使用 oracledb thick 模式)。
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_<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"连接池按数据库惰性创建——配置十个数据库在查询之前不产生任何开销。
用双引号包裹密码,使 $/# 被按字面处理。
连接字符串提示: 对于 PDB,请使用服务名形式
host:port/service。较旧的host:port:SID形式不是 Easy Connect——请转换(…:port/service)或使用 tnsnames 别名。
共享设置
变量 | 默认值 | 描述 |
| (来自 PATH) | Instant Client 目录。若未设置,通过 PATH/LD_LIBRARY_PATH 发现。 |
| — | 包含 |
|
| 任何工具返回行数的硬性上限(也是调用方可请求的最大值)。 |
|
| 每条语句的超时时间(thick 模式 |
|
| 连接池大小(按数据库)。 |
|
| 空闲连接修剪(秒)。 |
| — | 当省略 |
|
|
|
接入代理
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(已 gitignore)中,而非代理配置中。将 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为何做这些选择
独立 TS 包,而非合并到 JS 工程 MCP——隔离安全敏感 面,允许严格类型构建和独立部署/授权。
Thick 模式——为此部署选择(存在 Instant Client);启用最广泛的驱动 功能集。如需要,Thin 模式可移除客户端依赖。
声明式元数据工具——20 个字典工具共享一种安全形态(固定 SQL + 绑定 + 格式),因此添加一个工具只需几行,且安全属性统一。
单一
OracleClient汇聚点——每个查询都流经它,因此超时、行数上限、清理、 错误映射和日志记录在恰好一个位置强制执行。
工具参考
所有工具均以 oracle_ 为前缀。owner 作用域工具接受可选的 schema;搜索工具接受
可选的 limit(限制在 ORACLE_MAX_ROWS 内)。名称可写为 OBJECT 或 SCHEMA.OBJECT。
工具 | 关键参数 | 用途 |
|
| 执行受守卫保护的只读 SELECT。 |
|
| 对 SELECT 执行 EXPLAIN PLAN + DBMS_XPLAN(不触碰数据)。 |
| — | 列出账户可见的属主/模式。 |
|
| 列出表(可选过滤)。 |
|
| 名称包含关键字的表。 |
|
| 跨模式定位表,包括同义词。 |
|
| 列 + 类型 + 可空性 + 注释。 |
|
| 名称包含关键字的列(例如 |
|
| 拥有某列的表(精确匹配优先)。 |
|
| 索引及其列、唯一性、类型、状态。 |
|
| PK/FK/UK/CHECK 及其列、引用表、删除规则。 |
|
| 表上的触发器(时机、事件、状态)。 |
|
| 通过 |
|
| 视图 DDL + 列清单。 |
|
| 包规范源码。 |
|
| 包主体源码。 |
|
| 按名称关键字查找包。 |
|
| 查找过程/函数(独立及包内)。 |
|
| 所有 PL/SQL 源码的全文搜索——引用与调用方。 |
|
|
|
|
| 同义词; |
|
| 行数、块数、平均行长、最后分析时间。 |
|
| 处于 |
|
| 对象是什么(类型/属主/状态),来自 |
常见问题如何映射到工具
问题 | 工具 |
|
|
显示包主体 |
|
查找所有调用 |
|
所有对 |
|
描述 |
|
包含 "risk" 的列 |
|
表上的索引 / 外键 / 触发器 |
|
解释此查询 |
|
指向某表的同义词 |
|
无效对象 |
|
安全考虑
分层(纵深防御):
只读账户(第一道防线)。 只为连接用户授予
CREATE SESSION+SELECT(针对其必须检查的对象或角色),并为连接用户授予用于数据字典的SELECT_CATALOG_ROLE。MCP 应无法执行任何写入操作,无论其上层存在任何 bug。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。极少数误报(例如某列恰好以非保留关键字命名)可以通过别名绕过。
示例
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 语句。 |
工具返回的行涉及多个 schema | 该对象名存在于多个可见的 schema 中。请传入 |
智能体看不到输出,但 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