universal-db-mcp 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CONTRIBUTING.md CHANGED
@@ -40,8 +40,17 @@
40
40
  1. 在 `src/adapters/` 下创建新文件(如 `mongodb.ts`)
41
41
  2. 实现 `DbAdapter` 接口
42
42
  3. 在 `src/index.ts` 中添加对应的 case 分支
43
- 4. 更新 `README.md` 的支持列表
44
- 5. 添加相应的 npm 依赖
43
+ 4. `src/types/adapter.ts` 中更新类型定义
44
+ 5. 更新 `README.md` 的支持列表
45
+ 6. 添加相应的 npm 依赖
46
+
47
+ ### 参考示例
48
+
49
+ 可以参考现有的适配器实现:
50
+ - **MySQL** (`src/adapters/mysql.ts`) - SQL 数据库的基础模式
51
+ - **PostgreSQL** (`src/adapters/postgres.ts`) - 复杂的 Schema 查询
52
+ - **Redis** (`src/adapters/redis.ts`) - NoSQL 数据库的适配
53
+ - **Oracle** (`src/adapters/oracle.ts`) - 企业级数据库的完整实现
45
54
 
46
55
  ### 示例结构
47
56
 
package/DEPLOYMENT.md CHANGED
@@ -30,7 +30,8 @@
30
30
  "database",
31
31
  "mysql",
32
32
  "postgresql",
33
- "redis"
33
+ "redis",
34
+ "oracle"
34
35
  ]
35
36
  }
36
37
  ```
@@ -119,6 +120,16 @@ docker run -it \
119
120
  --password password \
120
121
  --database mydb
121
122
 
123
+ # Oracle 示例
124
+ docker run -it \
125
+ universal-db-mcp:latest \
126
+ --type oracle \
127
+ --host host.docker.internal \
128
+ --port 1521 \
129
+ --user system \
130
+ --password oracle_password \
131
+ --database XEPDB1
132
+
122
133
  # 使用环境变量
123
134
  docker run -it \
124
135
  -e DB_TYPE=mysql \
@@ -270,6 +281,17 @@ GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_readonly;
270
281
  ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO mcp_readonly;
271
282
  ```
272
283
 
284
+ **Oracle**:
285
+ ```sql
286
+ -- 创建只读用户
287
+ CREATE USER mcp_readonly IDENTIFIED BY secure_password;
288
+ GRANT CREATE SESSION TO mcp_readonly;
289
+ GRANT SELECT ANY TABLE TO mcp_readonly;
290
+
291
+ -- 或者授予特定表的权限
292
+ GRANT SELECT ON schema.table_name TO mcp_readonly;
293
+ ```
294
+
273
295
  ### 2. 使用环境变量存储密码
274
296
 
275
297
  创建 `.env` 文件(不要提交到 Git):
package/EXAMPLES.md CHANGED
@@ -7,6 +7,7 @@
7
7
  - [MySQL 使用示例](#mysql-使用示例)
8
8
  - [PostgreSQL 使用示例](#postgresql-使用示例)
9
9
  - [Redis 使用示例](#redis-使用示例)
10
+ - [Oracle 使用示例](#oracle-使用示例)
10
11
  - [Claude Desktop 配置示例](#claude-desktop-配置示例)
11
12
  - [常见使用场景](#常见使用场景)
12
13
 
@@ -182,6 +183,98 @@
182
183
 
183
184
  ---
184
185
 
186
+ ## Oracle 使用示例
187
+
188
+ ### 基础配置(只读模式)
189
+
190
+ ```json
191
+ {
192
+ "mcpServers": {
193
+ "oracle-db": {
194
+ "command": "npx",
195
+ "args": [
196
+ "universal-db-mcp",
197
+ "--type", "oracle",
198
+ "--host", "localhost",
199
+ "--port", "1521",
200
+ "--user", "system",
201
+ "--password", "your_password",
202
+ "--database", "XEPDB1"
203
+ ]
204
+ }
205
+ }
206
+ }
207
+ ```
208
+
209
+ ### 使用 Service Name 连接
210
+
211
+ ```json
212
+ {
213
+ "mcpServers": {
214
+ "oracle-prod": {
215
+ "command": "npx",
216
+ "args": [
217
+ "universal-db-mcp",
218
+ "--type", "oracle",
219
+ "--host", "oracle-server.example.com",
220
+ "--port", "1521",
221
+ "--user", "app_user",
222
+ "--password", "secure_password",
223
+ "--database", "ORCL"
224
+ ]
225
+ }
226
+ }
227
+ }
228
+ ```
229
+
230
+ ### 启用写入模式(谨慎使用)
231
+
232
+ ```json
233
+ {
234
+ "mcpServers": {
235
+ "oracle-dev": {
236
+ "command": "npx",
237
+ "args": [
238
+ "universal-db-mcp",
239
+ "--type", "oracle",
240
+ "--host", "localhost",
241
+ "--port", "1521",
242
+ "--user", "dev_user",
243
+ "--password", "dev_password",
244
+ "--database", "DEVDB",
245
+ "--danger-allow-write"
246
+ ]
247
+ }
248
+ }
249
+ }
250
+ ```
251
+
252
+ ### 与 Claude 对话示例
253
+
254
+ **用户**: 帮我查看 EMPLOYEES 表的结构
255
+
256
+ **Claude 会自动**:
257
+ 1. 调用 `get_table_info` 工具
258
+ 2. 返回表的列信息、主键、索引等
259
+ 3. 注意:Oracle 表名通常为大写
260
+
261
+ **用户**: 查询工资最高的 10 名员工
262
+
263
+ **Claude 会自动**:
264
+ 1. 理解需求
265
+ 2. 生成 SQL: `SELECT * FROM EMPLOYEES ORDER BY SALARY DESC FETCH FIRST 10 ROWS ONLY`
266
+ 3. 调用 `execute_query` 工具执行
267
+ 4. 返回结果
268
+
269
+ **用户**: 统计每个部门的员工数量
270
+
271
+ **Claude 会自动**:
272
+ 1. 查看表结构
273
+ 2. 生成 SQL: `SELECT DEPARTMENT_ID, COUNT(*) as EMP_COUNT FROM EMPLOYEES GROUP BY DEPARTMENT_ID`
274
+ 3. 执行并返回结果
275
+
276
+ ---
277
+
185
278
  ## Claude Desktop 配置示例
186
279
 
187
280
  ### 同时连接多个数据库
@@ -224,6 +317,18 @@
224
317
  "--port", "6379",
225
318
  "--password", "cache_password"
226
319
  ]
320
+ },
321
+ "oracle-warehouse": {
322
+ "command": "npx",
323
+ "args": [
324
+ "universal-db-mcp",
325
+ "--type", "oracle",
326
+ "--host", "oracle.example.com",
327
+ "--port", "1521",
328
+ "--user", "warehouse_user",
329
+ "--password", "warehouse_password",
330
+ "--database", "DWH"
331
+ ]
227
332
  }
228
333
  }
229
334
  }
@@ -234,6 +339,7 @@
234
339
  - "在 MySQL 生产库中查询..."
235
340
  - "从 PostgreSQL 分析库获取..."
236
341
  - "检查 Redis 缓存中的..."
342
+ - "在 Oracle 数据仓库中统计..."
237
343
 
238
344
  ---
239
345
 
package/README.md CHANGED
@@ -17,7 +17,7 @@
17
17
 
18
18
  ✅ **自然语言查询** - 用中文描述需求,Claude 自动生成并执行 SQL
19
19
  ✅ **智能表结构理解** - 自动获取数据库 Schema,提供精准建议
20
- ✅ **多数据库支持** - MySQL、PostgreSQL、Redis 一键切换
20
+ ✅ **多数据库支持** - MySQL、PostgreSQL、Redis、Oracle 一键切换
21
21
  ✅ **安全第一** - 默认只读模式,防止误操作删库
22
22
  ✅ **开箱即用** - 无需复杂配置,一行命令启动
23
23
 
@@ -27,7 +27,7 @@
27
27
 
28
28
  - Node.js >= 20
29
29
  - Claude Desktop 应用
30
- - 至少一个数据库实例(MySQL/PostgreSQL/Redis)
30
+ - 至少一个数据库实例(MySQL/PostgreSQL/Redis/Oracle
31
31
 
32
32
  ### 安装
33
33
 
@@ -105,6 +105,7 @@ Claude 会自动调用数据库工具完成查询!
105
105
  | MySQL | `--type mysql` | ✅ 已支持 |
106
106
  | PostgreSQL | `--type postgres` | ✅ 已支持 |
107
107
  | Redis | `--type redis` | ✅ 已支持 |
108
+ | Oracle | `--type oracle` | ✅ 已支持 |
108
109
  | MongoDB | `--type mongo` | 🚧 计划中 |
109
110
  | SQLite | `--type sqlite` | 🚧 计划中 |
110
111
 
@@ -114,7 +115,7 @@ Claude 会自动调用数据库工具完成查询!
114
115
  universal-db-mcp [选项]
115
116
 
116
117
  选项:
117
- --type <db> 数据库类型 (mysql|postgres|redis)
118
+ --type <db> 数据库类型 (mysql|postgres|redis|oracle)
118
119
  --host <host> 数据库主机地址 (默认: localhost)
119
120
  --port <port> 数据库端口
120
121
  --user <user> 用户名
@@ -133,7 +134,8 @@ src/
133
134
  ├── adapters/ # 数据库适配器
134
135
  │ ├── mysql.ts
135
136
  │ ├── postgres.ts
136
- └── redis.ts
137
+ ├── redis.ts
138
+ │ └── oracle.ts
137
139
  ├── types/ # TypeScript 类型定义
138
140
  │ └── adapter.ts
139
141
  ├── utils/ # 工具函数
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Oracle 数据库适配器
3
+ * 使用 oracledb 驱动实现 DbAdapter 接口
4
+ */
5
+ import type { DbAdapter, QueryResult, SchemaInfo } from '../types/adapter.js';
6
+ export declare class OracleAdapter implements DbAdapter {
7
+ private connection;
8
+ private config;
9
+ constructor(config: {
10
+ host: string;
11
+ port: number;
12
+ user?: string;
13
+ password?: string;
14
+ database?: string;
15
+ serviceName?: string;
16
+ sid?: string;
17
+ connectString?: string;
18
+ });
19
+ /**
20
+ * 构建 Oracle 连接字符串
21
+ */
22
+ private buildConnectionString;
23
+ /**
24
+ * 连接到 Oracle 数据库
25
+ */
26
+ connect(): Promise<void>;
27
+ /**
28
+ * 断开数据库连接
29
+ */
30
+ disconnect(): Promise<void>;
31
+ /**
32
+ * 执行 SQL 查询
33
+ */
34
+ executeQuery(query: string, params?: unknown[]): Promise<QueryResult>;
35
+ /**
36
+ * 获取数据库结构信息
37
+ */
38
+ getSchema(): Promise<SchemaInfo>;
39
+ /**
40
+ * 获取单个表的详细信息
41
+ */
42
+ private getTableInfo;
43
+ /**
44
+ * 格式化 Oracle 数据类型
45
+ */
46
+ private formatOracleType;
47
+ /**
48
+ * 检查是否为写操作
49
+ */
50
+ isWriteOperation(query: string): boolean;
51
+ }
52
+ //# sourceMappingURL=oracle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.d.ts","sourceRoot":"","sources":["../../src/adapters/oracle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,UAAU,EAIX,MAAM,qBAAqB,CAAC;AAG7B,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,MAAM,CASZ;gBAEU,MAAM,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB;IAOD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAkB7B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAWjC;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA6D3E;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAoDtC;;OAEG;YACW,YAAY;IAkJ1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CA+BzC"}
@@ -0,0 +1,342 @@
1
+ /**
2
+ * Oracle 数据库适配器
3
+ * 使用 oracledb 驱动实现 DbAdapter 接口
4
+ */
5
+ import oracledb from 'oracledb';
6
+ import { isWriteOperation as checkWriteOperation } from '../utils/safety.js';
7
+ export class OracleAdapter {
8
+ connection = null;
9
+ config;
10
+ constructor(config) {
11
+ this.config = config;
12
+ // 配置 oracledb 全局设置
13
+ oracledb.outFormat = oracledb.OUT_FORMAT_OBJECT;
14
+ oracledb.fetchAsString = [oracledb.CLOB];
15
+ }
16
+ /**
17
+ * 构建 Oracle 连接字符串
18
+ */
19
+ buildConnectionString() {
20
+ // 优先级: connectString > serviceName > sid > database
21
+ if (this.config.connectString) {
22
+ return this.config.connectString;
23
+ }
24
+ const host = this.config.host;
25
+ const port = this.config.port || 1521;
26
+ const service = this.config.serviceName || this.config.sid || this.config.database;
27
+ if (!service) {
28
+ throw new Error('必须提供 database、serviceName 或 sid');
29
+ }
30
+ // 构建 Easy Connect 字符串
31
+ return `${host}:${port}/${service}`;
32
+ }
33
+ /**
34
+ * 连接到 Oracle 数据库
35
+ */
36
+ async connect() {
37
+ try {
38
+ const connectionString = this.buildConnectionString();
39
+ this.connection = await oracledb.getConnection({
40
+ user: this.config.user,
41
+ password: this.config.password,
42
+ connectString: connectionString,
43
+ });
44
+ // 测试连接
45
+ await this.connection.execute('SELECT 1 FROM DUAL');
46
+ }
47
+ catch (error) {
48
+ // 翻译常见的 Oracle 错误
49
+ if (error.errorNum === 1017) {
50
+ throw new Error('Oracle 连接失败: 用户名或密码无效');
51
+ }
52
+ else if (error.errorNum === 12154) {
53
+ throw new Error('Oracle 连接失败: 无法解析连接标识符,请检查 TNS 配置');
54
+ }
55
+ else if (error.errorNum === 12541) {
56
+ throw new Error('Oracle 连接失败: TNS 无监听程序');
57
+ }
58
+ throw new Error(`Oracle 连接失败: ${error instanceof Error ? error.message : String(error)}`);
59
+ }
60
+ }
61
+ /**
62
+ * 断开数据库连接
63
+ */
64
+ async disconnect() {
65
+ if (this.connection) {
66
+ try {
67
+ await this.connection.close();
68
+ }
69
+ catch (error) {
70
+ // 忽略关闭连接时的错误
71
+ }
72
+ this.connection = null;
73
+ }
74
+ }
75
+ /**
76
+ * 执行 SQL 查询
77
+ */
78
+ async executeQuery(query, params) {
79
+ if (!this.connection) {
80
+ throw new Error('数据库未连接');
81
+ }
82
+ const startTime = Date.now();
83
+ try {
84
+ // 执行查询,autoCommit 设置为 false(只读安全)
85
+ const result = await this.connection.execute(query, params || [], {
86
+ autoCommit: false,
87
+ outFormat: oracledb.OUT_FORMAT_OBJECT,
88
+ });
89
+ const executionTime = Date.now() - startTime;
90
+ // 处理查询结果
91
+ if (result.rows && result.rows.length > 0) {
92
+ // SELECT 查询 - 将列名转换为小写
93
+ const rows = result.rows.map((row) => {
94
+ const lowerCaseRow = {};
95
+ for (const [key, value] of Object.entries(row)) {
96
+ lowerCaseRow[key.toLowerCase()] = value;
97
+ }
98
+ return lowerCaseRow;
99
+ });
100
+ return {
101
+ rows,
102
+ executionTime,
103
+ metadata: {
104
+ columnCount: result.metaData?.length || 0,
105
+ },
106
+ };
107
+ }
108
+ else if (result.rowsAffected !== undefined && result.rowsAffected > 0) {
109
+ // DML 操作 (INSERT/UPDATE/DELETE)
110
+ return {
111
+ rows: [],
112
+ affectedRows: result.rowsAffected,
113
+ executionTime,
114
+ };
115
+ }
116
+ else {
117
+ // 其他操作或空结果
118
+ return {
119
+ rows: [],
120
+ executionTime,
121
+ };
122
+ }
123
+ }
124
+ catch (error) {
125
+ // 翻译常见的 Oracle 错误
126
+ if (error.errorNum === 942) {
127
+ throw new Error('查询执行失败: 表或视图不存在');
128
+ }
129
+ else if (error.errorNum === 1) {
130
+ throw new Error('查询执行失败: 违反唯一约束');
131
+ }
132
+ throw new Error(`查询执行失败: ${error instanceof Error ? error.message : String(error)}`);
133
+ }
134
+ }
135
+ /**
136
+ * 获取数据库结构信息
137
+ */
138
+ async getSchema() {
139
+ if (!this.connection) {
140
+ throw new Error('数据库未连接');
141
+ }
142
+ try {
143
+ // 获取 Oracle 版本
144
+ const versionResult = await this.connection.execute(`SELECT banner FROM v$version WHERE banner LIKE 'Oracle%'`);
145
+ const version = versionResult.rows?.[0]
146
+ ? Object.values(versionResult.rows[0])[0]
147
+ : 'unknown';
148
+ // 获取当前用户
149
+ const userResult = await this.connection.execute('SELECT USER FROM DUAL');
150
+ const databaseName = userResult.rows?.[0]
151
+ ? Object.values(userResult.rows[0])[0]
152
+ : 'unknown';
153
+ // 获取所有表
154
+ const tablesResult = await this.connection.execute(`SELECT table_name, num_rows, tablespace_name
155
+ FROM all_tables
156
+ WHERE owner = USER
157
+ AND temporary = 'N'
158
+ ORDER BY table_name`);
159
+ const tableInfos = [];
160
+ if (tablesResult.rows) {
161
+ for (const tableRow of tablesResult.rows) {
162
+ const tableName = tableRow.TABLE_NAME;
163
+ const tableInfo = await this.getTableInfo(tableName);
164
+ tableInfos.push(tableInfo);
165
+ }
166
+ }
167
+ return {
168
+ databaseType: 'oracle',
169
+ databaseName,
170
+ tables: tableInfos,
171
+ version,
172
+ };
173
+ }
174
+ catch (error) {
175
+ throw new Error(`获取数据库结构失败: ${error instanceof Error ? error.message : String(error)}`);
176
+ }
177
+ }
178
+ /**
179
+ * 获取单个表的详细信息
180
+ */
181
+ async getTableInfo(tableName) {
182
+ if (!this.connection) {
183
+ throw new Error('数据库未连接');
184
+ }
185
+ // 获取列信息
186
+ const columnsResult = await this.connection.execute(`SELECT column_name, data_type, data_length, data_precision,
187
+ data_scale, nullable, data_default, column_id
188
+ FROM all_tab_columns
189
+ WHERE owner = USER
190
+ AND table_name = :tableName
191
+ ORDER BY column_id`, [tableName]);
192
+ const columnInfos = [];
193
+ if (columnsResult.rows) {
194
+ for (const col of columnsResult.rows) {
195
+ const colData = col;
196
+ columnInfos.push({
197
+ name: colData.COLUMN_NAME.toLowerCase(),
198
+ type: this.formatOracleType(colData.DATA_TYPE, colData.DATA_LENGTH, colData.DATA_PRECISION, colData.DATA_SCALE),
199
+ nullable: colData.NULLABLE === 'Y',
200
+ defaultValue: colData.DATA_DEFAULT?.trim() || undefined,
201
+ });
202
+ }
203
+ }
204
+ // 获取列注释
205
+ const commentsResult = await this.connection.execute(`SELECT column_name, comments
206
+ FROM all_col_comments
207
+ WHERE owner = USER
208
+ AND table_name = :tableName
209
+ AND comments IS NOT NULL`, [tableName]);
210
+ const commentsMap = new Map();
211
+ if (commentsResult.rows) {
212
+ for (const row of commentsResult.rows) {
213
+ const rowData = row;
214
+ commentsMap.set(rowData.COLUMN_NAME.toLowerCase(), rowData.COMMENTS);
215
+ }
216
+ }
217
+ // 将注释添加到列信息中
218
+ for (const col of columnInfos) {
219
+ if (commentsMap.has(col.name)) {
220
+ col.comment = commentsMap.get(col.name);
221
+ }
222
+ }
223
+ // 获取主键
224
+ const primaryKeysResult = await this.connection.execute(`SELECT cols.column_name, cols.position
225
+ FROM all_constraints cons
226
+ JOIN all_cons_columns cols
227
+ ON cons.constraint_name = cols.constraint_name
228
+ AND cons.owner = cols.owner
229
+ WHERE cons.constraint_type = 'P'
230
+ AND cons.owner = USER
231
+ AND cons.table_name = :tableName
232
+ ORDER BY cols.position`, [tableName]);
233
+ const primaryKeys = [];
234
+ if (primaryKeysResult.rows) {
235
+ for (const row of primaryKeysResult.rows) {
236
+ primaryKeys.push(row.COLUMN_NAME.toLowerCase());
237
+ }
238
+ }
239
+ // 获取索引信息
240
+ const indexesResult = await this.connection.execute(`SELECT i.index_name, i.uniqueness, ic.column_name, ic.column_position
241
+ FROM all_indexes i
242
+ JOIN all_ind_columns ic
243
+ ON i.index_name = ic.index_name
244
+ AND i.owner = ic.index_owner
245
+ WHERE i.owner = USER
246
+ AND i.table_name = :tableName
247
+ AND i.index_type != 'LOB'
248
+ ORDER BY i.index_name, ic.column_position`, [tableName]);
249
+ const indexMap = new Map();
250
+ if (indexesResult.rows) {
251
+ for (const row of indexesResult.rows) {
252
+ const rowData = row;
253
+ const indexName = rowData.INDEX_NAME;
254
+ // 跳过主键索引
255
+ if (indexName.includes('PK_') || indexName.includes('SYS_')) {
256
+ continue;
257
+ }
258
+ if (!indexMap.has(indexName)) {
259
+ indexMap.set(indexName, {
260
+ columns: [],
261
+ unique: rowData.UNIQUENESS === 'UNIQUE',
262
+ });
263
+ }
264
+ indexMap.get(indexName).columns.push(rowData.COLUMN_NAME.toLowerCase());
265
+ }
266
+ }
267
+ const indexInfos = Array.from(indexMap.entries()).map(([name, info]) => ({
268
+ name,
269
+ columns: info.columns,
270
+ unique: info.unique,
271
+ }));
272
+ // 获取表行数估算
273
+ const rowCountResult = await this.connection.execute(`SELECT num_rows FROM all_tables WHERE owner = USER AND table_name = :tableName`, [tableName]);
274
+ const estimatedRows = rowCountResult.rows?.[0]
275
+ ? (rowCountResult.rows[0].NUM_ROWS || 0)
276
+ : 0;
277
+ return {
278
+ name: tableName.toLowerCase(),
279
+ columns: columnInfos,
280
+ primaryKeys,
281
+ indexes: indexInfos,
282
+ estimatedRows,
283
+ };
284
+ }
285
+ /**
286
+ * 格式化 Oracle 数据类型
287
+ */
288
+ formatOracleType(dataType, length, precision, scale) {
289
+ switch (dataType) {
290
+ case 'NUMBER':
291
+ if (precision !== null && precision !== undefined) {
292
+ if (scale !== null && scale !== undefined && scale > 0) {
293
+ return `NUMBER(${precision},${scale})`;
294
+ }
295
+ return `NUMBER(${precision})`;
296
+ }
297
+ return 'NUMBER';
298
+ case 'VARCHAR2':
299
+ case 'CHAR':
300
+ if (length) {
301
+ return `${dataType}(${length})`;
302
+ }
303
+ return dataType;
304
+ case 'TIMESTAMP':
305
+ if (scale !== null && scale !== undefined) {
306
+ return `TIMESTAMP(${scale})`;
307
+ }
308
+ return 'TIMESTAMP';
309
+ default:
310
+ return dataType;
311
+ }
312
+ }
313
+ /**
314
+ * 检查是否为写操作
315
+ */
316
+ isWriteOperation(query) {
317
+ // 首先使用通用的写操作检测
318
+ if (checkWriteOperation(query)) {
319
+ return true;
320
+ }
321
+ // 添加 Oracle 特定的写操作检测
322
+ const trimmedQuery = query.trim().toUpperCase();
323
+ // MERGE 语句(Oracle 的 upsert 操作)
324
+ if (trimmedQuery.startsWith('MERGE')) {
325
+ return true;
326
+ }
327
+ // PL/SQL 块(可能包含写操作)
328
+ if (trimmedQuery.startsWith('BEGIN') || trimmedQuery.startsWith('DECLARE')) {
329
+ return true;
330
+ }
331
+ // CALL 存储过程(可能包含写操作)
332
+ if (trimmedQuery.startsWith('CALL')) {
333
+ return true;
334
+ }
335
+ // 事务控制语句
336
+ if (trimmedQuery.startsWith('COMMIT') || trimmedQuery.startsWith('ROLLBACK')) {
337
+ return true;
338
+ }
339
+ return false;
340
+ }
341
+ }
342
+ //# sourceMappingURL=oracle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../src/adapters/oracle.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,12 +7,13 @@ import { DatabaseMCPServer } from './server.js';
7
7
  import { MySQLAdapter } from './adapters/mysql.js';
8
8
  import { PostgreSQLAdapter } from './adapters/postgres.js';
9
9
  import { RedisAdapter } from './adapters/redis.js';
10
+ import { OracleAdapter } from './adapters/oracle.js';
10
11
  const program = new Command();
11
12
  program
12
13
  .name('universal-db-mcp')
13
14
  .description('MCP 数据库万能连接器 - 让 Claude Desktop 直接连接你的数据库')
14
15
  .version('0.1.0')
15
- .requiredOption('--type <type>', '数据库类型 (mysql|postgres|redis)')
16
+ .requiredOption('--type <type>', '数据库类型 (mysql|postgres|redis|oracle)')
16
17
  .requiredOption('--host <host>', '数据库主机地址')
17
18
  .requiredOption('--port <port>', '数据库端口', parseInt)
18
19
  .option('--user <user>', '用户名')
@@ -22,8 +23,8 @@ program
22
23
  .action(async (options) => {
23
24
  try {
24
25
  // 验证数据库类型
25
- if (!['mysql', 'postgres', 'redis'].includes(options.type)) {
26
- console.error('❌ 错误: 不支持的数据库类型。支持的类型: mysql, postgres, redis');
26
+ if (!['mysql', 'postgres', 'redis', 'oracle'].includes(options.type)) {
27
+ console.error('❌ 错误: 不支持的数据库类型。支持的类型: mysql, postgres, redis, oracle');
27
28
  process.exit(1);
28
29
  }
29
30
  // 构建配置
@@ -73,6 +74,15 @@ program
73
74
  database: config.database,
74
75
  });
75
76
  break;
77
+ case 'oracle':
78
+ adapter = new OracleAdapter({
79
+ host: config.host,
80
+ port: config.port,
81
+ user: config.user,
82
+ password: config.password,
83
+ database: config.database,
84
+ });
85
+ break;
76
86
  default:
77
87
  throw new Error(`不支持的数据库类型: ${config.type}`);
78
88
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -49,7 +49,7 @@ export interface QueryResult {
49
49
  */
50
50
  export interface SchemaInfo {
51
51
  /** 数据库类型 */
52
- databaseType: 'mysql' | 'postgres' | 'redis';
52
+ databaseType: 'mysql' | 'postgres' | 'redis' | 'oracle';
53
53
  /** 数据库名称 */
54
54
  databaseName: string;
55
55
  /** 表信息列表 */
@@ -102,7 +102,7 @@ export interface IndexInfo {
102
102
  * 数据库连接配置
103
103
  */
104
104
  export interface DbConfig {
105
- type: 'mysql' | 'postgres' | 'redis';
105
+ type: 'mysql' | 'postgres' | 'redis' | 'oracle';
106
106
  host: string;
107
107
  port: number;
108
108
  user?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/types/adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEtE;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAEjC;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,eAAe;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY;IACZ,YAAY,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IAC7C,YAAY;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY;IACZ,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,SAAS;IACT,IAAI,EAAE,MAAM,CAAC;IACb,UAAU;IACV,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,WAAW;IACX,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW;IACX,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,WAAW;IACX,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS;IACT,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU;IACV,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU;IACV,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/types/adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEtE;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAEjC;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,eAAe;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY;IACZ,YAAY,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;IACxD,YAAY;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY;IACZ,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,SAAS;IACT,IAAI,EAAE,MAAM,CAAC;IACb,UAAU;IACV,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,WAAW;IACX,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW;IACX,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,WAAW;IACX,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS;IACT,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU;IACV,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU;IACV,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "universal-db-mcp",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "MCP 数据库万能连接器 - 让 Claude Desktop 直接连接你的数据库",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -21,6 +21,7 @@
21
21
  "mysql",
22
22
  "postgresql",
23
23
  "redis",
24
+ "oracle",
24
25
  "数据库",
25
26
  "AI"
26
27
  ],
@@ -43,17 +44,22 @@
43
44
  "commander": "^12.1.0",
44
45
  "ioredis": "^5.4.2",
45
46
  "mysql2": "^3.11.5",
47
+ "oracledb": "^6.7.0",
46
48
  "pg": "^8.13.1",
47
49
  "zod": "^3.24.1"
48
50
  },
49
51
  "devDependencies": {
50
52
  "@types/node": "^22.10.5",
53
+ "@types/oracledb": "^6.5.1",
51
54
  "@types/pg": "^8.11.10",
52
55
  "typescript": "^5.7.3"
53
56
  },
54
57
  "engines": {
55
58
  "node": ">=20.0.0"
56
59
  },
60
+ "publishConfig": {
61
+ "access": "public"
62
+ },
57
63
  "repository": {
58
64
  "type": "git",
59
65
  "url": "https://github.com/Anarkh-Lee/universal-db-mcp.git"