universal-db-mcp 0.1.1 → 0.3.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,18 @@
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`) - 企业级数据库的完整实现
54
+ - **达梦** (`src/adapters/dm.ts`) - 国产数据库适配,兼容 Oracle
45
55
 
46
56
  ### 示例结构
47
57
 
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,174 @@
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
+
278
+ ## 达梦 使用示例
279
+
280
+ ### 基础配置(只读模式)
281
+
282
+ ```json
283
+ {
284
+ "mcpServers": {
285
+ "dm-db": {
286
+ "command": "npx",
287
+ "args": [
288
+ "universal-db-mcp",
289
+ "--type", "dm",
290
+ "--host", "localhost",
291
+ "--port", "5236",
292
+ "--user", "SYSDBA",
293
+ "--password", "SYSDBA",
294
+ "--database", "DAMENG"
295
+ ]
296
+ }
297
+ }
298
+ }
299
+ ```
300
+
301
+ **注意**: 达梦数据库驱动 `dmdb` 会作为可选依赖自动安装。如果安装失败,请手动运行:
302
+
303
+ ```bash
304
+ npm install -g dmdb
305
+ ```
306
+
307
+ ### 连接远程达梦数据库
308
+
309
+ ```json
310
+ {
311
+ "mcpServers": {
312
+ "dm-prod": {
313
+ "command": "npx",
314
+ "args": [
315
+ "universal-db-mcp",
316
+ "--type", "dm",
317
+ "--host", "dm-server.example.com",
318
+ "--port", "5236",
319
+ "--user", "app_user",
320
+ "--password", "secure_password",
321
+ "--database", "PRODUCTION"
322
+ ]
323
+ }
324
+ }
325
+ }
326
+ ```
327
+
328
+ ### 与 Claude 对话示例
329
+
330
+ **用户**: 查看数据库中的所有表
331
+
332
+ **Claude 会自动**:
333
+
334
+ 1. 调用 `get_schema` 工具
335
+ 2. 返回所有表的列表和基本信息
336
+
337
+ **用户**: 查询部门表中的所有记录
338
+
339
+ **Claude 会自动**:
340
+
341
+ 1. 生成 SQL: `SELECT * FROM DEPT`
342
+ 2. 执行查询并返回结果
343
+
344
+ **用户**: 统计每个部门的员工数量
345
+
346
+ **Claude 会自动**:
347
+
348
+ 1. 理解需求
349
+ 2. 生成 SQL: `SELECT DEPT_ID, COUNT(*) as EMP_COUNT FROM EMPLOYEES GROUP BY DEPT_ID`
350
+ 3. 执行并返回结果
351
+
352
+ ---
353
+
185
354
  ## Claude Desktop 配置示例
186
355
 
187
356
  ### 同时连接多个数据库
@@ -224,6 +393,18 @@
224
393
  "--port", "6379",
225
394
  "--password", "cache_password"
226
395
  ]
396
+ },
397
+ "oracle-warehouse": {
398
+ "command": "npx",
399
+ "args": [
400
+ "universal-db-mcp",
401
+ "--type", "oracle",
402
+ "--host", "oracle.example.com",
403
+ "--port", "1521",
404
+ "--user", "warehouse_user",
405
+ "--password", "warehouse_password",
406
+ "--database", "DWH"
407
+ ]
227
408
  }
228
409
  }
229
410
  }
@@ -234,6 +415,7 @@
234
415
  - "在 MySQL 生产库中查询..."
235
416
  - "从 PostgreSQL 分析库获取..."
236
417
  - "检查 Redis 缓存中的..."
418
+ - "在 Oracle 数据仓库中统计..."
237
419
 
238
420
  ---
239
421
 
package/README.md CHANGED
@@ -16,18 +16,24 @@
16
16
  **MCP 数据库万能连接器** 通过 Model Context Protocol (MCP) 协议,让 Claude Desktop 成为你的数据库助手:
17
17
 
18
18
  ✅ **自然语言查询** - 用中文描述需求,Claude 自动生成并执行 SQL
19
+
19
20
  ✅ **智能表结构理解** - 自动获取数据库 Schema,提供精准建议
20
- ✅ **多数据库支持** - MySQL、PostgreSQL、Redis 一键切换
21
+
22
+ ✅ **多数据库支持** - MySQL、PostgreSQL、Redis、Oracle、达梦 一键切换
23
+
21
24
  ✅ **安全第一** - 默认只读模式,防止误操作删库
25
+
22
26
  ✅ **开箱即用** - 无需复杂配置,一行命令启动
23
27
 
28
+
29
+
24
30
  ## 🚀 快速开始
25
31
 
26
32
  ### 前置要求
27
33
 
28
34
  - Node.js >= 20
29
35
  - Claude Desktop 应用
30
- - 至少一个数据库实例(MySQL/PostgreSQL/Redis
36
+ - 至少一个数据库实例(MySQL/PostgreSQL/Redis/Oracle/达梦)
31
37
 
32
38
  ### 安装
33
39
 
@@ -100,13 +106,17 @@ Claude 会自动调用数据库工具完成查询!
100
106
 
101
107
  ## 📖 支持的数据库
102
108
 
103
- | 数据库 | 类型参数 | 状态 |
104
- |--------|---------|------|
105
- | MySQL | `--type mysql` | ✅ 已支持 |
106
- | PostgreSQL | `--type postgres` | ✅ 已支持 |
107
- | Redis | `--type redis` | ✅ 已支持 |
108
- | MongoDB | `--type mongo` | 🚧 计划中 |
109
- | SQLite | `--type sqlite` | 🚧 计划中 |
109
+ | 数据库 | 类型参数 | 默认端口 | 状态 | 说明 |
110
+ |--------|---------|---------|------|------|
111
+ | MySQL | `--type mysql` | 3306 | ✅ 已支持 | - |
112
+ | PostgreSQL | `--type postgres` | 5432 | ✅ 已支持 | - |
113
+ | Redis | `--type redis` | 6379 | ✅ 已支持 | - |
114
+ | Oracle(12c以上) | `--type oracle` | 1521 | ✅ 已支持 | - |
115
+ | 达梦(DM7/DM8) | `--type dm` | 5236 | ✅ 已支持 | 驱动自动安装 |
116
+ | MongoDB | `--type mongo` | - | 🚧 计划中 | - |
117
+ | SQLite | `--type sqlite` | - | 🚧 计划中 | - |
118
+
119
+ **注意**: 达梦数据库驱动 `dmdb` 会作为可选依赖自动安装。如果安装失败,请手动运行 `npm install -g dmdb`。
110
120
 
111
121
  ## 🔧 命令行参数
112
122
 
@@ -114,7 +124,7 @@ Claude 会自动调用数据库工具完成查询!
114
124
  universal-db-mcp [选项]
115
125
 
116
126
  选项:
117
- --type <db> 数据库类型 (mysql|postgres|redis)
127
+ --type <db> 数据库类型 (mysql|postgres|redis|oracle|dm)
118
128
  --host <host> 数据库主机地址 (默认: localhost)
119
129
  --port <port> 数据库端口
120
130
  --user <user> 用户名
@@ -133,7 +143,9 @@ src/
133
143
  ├── adapters/ # 数据库适配器
134
144
  │ ├── mysql.ts
135
145
  │ ├── postgres.ts
136
- └── redis.ts
146
+ ├── redis.ts
147
+ │ ├── oracle.ts
148
+ │ └── dm.ts
137
149
  ├── types/ # TypeScript 类型定义
138
150
  │ └── adapter.ts
139
151
  ├── utils/ # 工具函数
@@ -0,0 +1,47 @@
1
+ /**
2
+ * 达梦数据库适配器
3
+ * 达梦数据库高度兼容 Oracle,使用类似的 API 和系统视图
4
+ *
5
+ * dmdb 驱动会作为可选依赖自动安装
6
+ */
7
+ import type { DbAdapter, QueryResult, SchemaInfo } from '../types/adapter.js';
8
+ export declare class DMAdapter implements DbAdapter {
9
+ private connection;
10
+ private config;
11
+ constructor(config: {
12
+ host: string;
13
+ port: number;
14
+ user?: string;
15
+ password?: string;
16
+ database?: string;
17
+ });
18
+ /**
19
+ * 连接到达梦数据库
20
+ */
21
+ connect(): Promise<void>;
22
+ /**
23
+ * 断开数据库连接
24
+ */
25
+ disconnect(): Promise<void>;
26
+ /**
27
+ * 执行 SQL 查询
28
+ */
29
+ executeQuery(query: string, params?: unknown[]): Promise<QueryResult>;
30
+ /**
31
+ * 获取数据库结构信息
32
+ */
33
+ getSchema(): Promise<SchemaInfo>;
34
+ /**
35
+ * 获取单个表的详细信息
36
+ */
37
+ private getTableInfo;
38
+ /**
39
+ * 格式化达梦数据类型
40
+ */
41
+ private formatDMType;
42
+ /**
43
+ * 检查是否为写操作
44
+ */
45
+ isWriteOperation(query: string): boolean;
46
+ }
47
+ //# sourceMappingURL=dm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dm.d.ts","sourceRoot":"","sources":["../../src/adapters/dm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,UAAU,EAIX,MAAM,qBAAqB,CAAC;AAyB7B,qBAAa,SAAU,YAAW,SAAS;IACzC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAMZ;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;KACnB;IAID;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B9B;;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;IA4D3E;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAoDtC;;OAEG;YACW,YAAY;IA2I1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAqCpB;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CA+BzC"}
@@ -0,0 +1,336 @@
1
+ /**
2
+ * 达梦数据库适配器
3
+ * 达梦数据库高度兼容 Oracle,使用类似的 API 和系统视图
4
+ *
5
+ * dmdb 驱动会作为可选依赖自动安装
6
+ */
7
+ import { isWriteOperation as checkWriteOperation } from '../utils/safety.js';
8
+ // 动态导入 dmdb,因为它是可选依赖
9
+ let dmdb = null;
10
+ async function loadDMDB() {
11
+ if (dmdb) {
12
+ return dmdb;
13
+ }
14
+ try {
15
+ // @ts-ignore - dmdb 是可选依赖,可能未安装
16
+ const module = await import('dmdb');
17
+ dmdb = module.default || module;
18
+ return dmdb;
19
+ }
20
+ catch (error) {
21
+ throw new Error('达梦数据库驱动未安装。\n' +
22
+ '请运行以下命令安装:npm install dmdb\n' +
23
+ '或者全局安装:npm install -g dmdb');
24
+ }
25
+ }
26
+ export class DMAdapter {
27
+ connection = null;
28
+ config;
29
+ constructor(config) {
30
+ this.config = config;
31
+ }
32
+ /**
33
+ * 连接到达梦数据库
34
+ */
35
+ async connect() {
36
+ try {
37
+ const DM = await loadDMDB();
38
+ // 达梦数据库连接配置
39
+ const connectionConfig = {
40
+ host: this.config.host,
41
+ port: this.config.port || 5236, // 达梦默认端口
42
+ user: this.config.user,
43
+ password: this.config.password,
44
+ database: this.config.database,
45
+ };
46
+ this.connection = await DM.getConnection(connectionConfig);
47
+ // 测试连接
48
+ await this.connection.execute('SELECT 1 FROM DUAL', []);
49
+ }
50
+ catch (error) {
51
+ // 翻译常见错误
52
+ const errorMessage = error instanceof Error ? error.message : String(error);
53
+ if (errorMessage.includes('用户名') || errorMessage.includes('密码')) {
54
+ throw new Error('达梦数据库连接失败: 用户名或密码无效');
55
+ }
56
+ else if (errorMessage.includes('连接') || errorMessage.includes('网络')) {
57
+ throw new Error('达梦数据库连接失败: 无法连接到数据库服务器,请检查主机地址和端口');
58
+ }
59
+ throw new Error(`达梦数据库连接失败: ${errorMessage}`);
60
+ }
61
+ }
62
+ /**
63
+ * 断开数据库连接
64
+ */
65
+ async disconnect() {
66
+ if (this.connection) {
67
+ try {
68
+ await this.connection.close();
69
+ }
70
+ catch (error) {
71
+ // 忽略关闭连接时的错误
72
+ }
73
+ this.connection = null;
74
+ }
75
+ }
76
+ /**
77
+ * 执行 SQL 查询
78
+ */
79
+ async executeQuery(query, params) {
80
+ if (!this.connection) {
81
+ throw new Error('数据库未连接');
82
+ }
83
+ const startTime = Date.now();
84
+ try {
85
+ // 执行查询
86
+ const result = await this.connection.execute(query, params || [], {
87
+ autoCommit: false,
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
+ const errorMessage = error instanceof Error ? error.message : String(error);
126
+ if (errorMessage.includes('表') || errorMessage.includes('视图')) {
127
+ throw new Error('查询执行失败: 表或视图不存在');
128
+ }
129
+ else if (errorMessage.includes('约束')) {
130
+ throw new Error('查询执行失败: 违反唯一约束');
131
+ }
132
+ throw new Error(`查询执行失败: ${errorMessage}`);
133
+ }
134
+ }
135
+ /**
136
+ * 获取数据库结构信息
137
+ */
138
+ async getSchema() {
139
+ if (!this.connection) {
140
+ throw new Error('数据库未连接');
141
+ }
142
+ try {
143
+ // 获取达梦数据库版本
144
+ const versionResult = await this.connection.execute(`SELECT BANNER FROM V$VERSION WHERE ROWNUM = 1`, []);
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
155
+ FROM USER_TABLES
156
+ ORDER BY TABLE_NAME`, []);
157
+ const tableInfos = [];
158
+ if (tablesResult.rows) {
159
+ for (const tableRow of tablesResult.rows) {
160
+ const tableName = tableRow.TABLE_NAME;
161
+ const tableInfo = await this.getTableInfo(tableName);
162
+ tableInfos.push(tableInfo);
163
+ }
164
+ }
165
+ return {
166
+ databaseType: 'dm',
167
+ databaseName,
168
+ tables: tableInfos,
169
+ version,
170
+ };
171
+ }
172
+ catch (error) {
173
+ throw new Error(`获取数据库结构失败: ${error instanceof Error ? error.message : String(error)}`);
174
+ }
175
+ }
176
+ /**
177
+ * 获取单个表的详细信息
178
+ */
179
+ async getTableInfo(tableName) {
180
+ if (!this.connection) {
181
+ throw new Error('数据库未连接');
182
+ }
183
+ // 获取列信息
184
+ const columnsResult = await this.connection.execute(`SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION,
185
+ DATA_SCALE, NULLABLE, DATA_DEFAULT, COLUMN_ID
186
+ FROM USER_TAB_COLUMNS
187
+ WHERE TABLE_NAME = :1
188
+ ORDER BY COLUMN_ID`, [tableName]);
189
+ const columnInfos = [];
190
+ if (columnsResult.rows) {
191
+ for (const col of columnsResult.rows) {
192
+ const colData = col;
193
+ columnInfos.push({
194
+ name: colData.COLUMN_NAME.toLowerCase(),
195
+ type: this.formatDMType(colData.DATA_TYPE, colData.DATA_LENGTH, colData.DATA_PRECISION, colData.DATA_SCALE),
196
+ nullable: colData.NULLABLE === 'Y',
197
+ defaultValue: colData.DATA_DEFAULT?.trim() || undefined,
198
+ });
199
+ }
200
+ }
201
+ // 获取列注释
202
+ const commentsResult = await this.connection.execute(`SELECT COLUMN_NAME, COMMENTS
203
+ FROM USER_COL_COMMENTS
204
+ WHERE TABLE_NAME = :1
205
+ AND COMMENTS IS NOT NULL`, [tableName]);
206
+ const commentsMap = new Map();
207
+ if (commentsResult.rows) {
208
+ for (const row of commentsResult.rows) {
209
+ const rowData = row;
210
+ commentsMap.set(rowData.COLUMN_NAME.toLowerCase(), rowData.COMMENTS);
211
+ }
212
+ }
213
+ // 将注释添加到列信息中
214
+ for (const col of columnInfos) {
215
+ if (commentsMap.has(col.name)) {
216
+ col.comment = commentsMap.get(col.name);
217
+ }
218
+ }
219
+ // 获取主键
220
+ const primaryKeysResult = await this.connection.execute(`SELECT cols.COLUMN_NAME, cols.POSITION
221
+ FROM USER_CONSTRAINTS cons
222
+ JOIN USER_CONS_COLUMNS cols
223
+ ON cons.CONSTRAINT_NAME = cols.CONSTRAINT_NAME
224
+ WHERE cons.CONSTRAINT_TYPE = 'P'
225
+ AND cons.TABLE_NAME = :1
226
+ ORDER BY cols.POSITION`, [tableName]);
227
+ const primaryKeys = [];
228
+ if (primaryKeysResult.rows) {
229
+ for (const row of primaryKeysResult.rows) {
230
+ primaryKeys.push(row.COLUMN_NAME.toLowerCase());
231
+ }
232
+ }
233
+ // 获取索引信息
234
+ const indexesResult = await this.connection.execute(`SELECT i.INDEX_NAME, i.UNIQUENESS, ic.COLUMN_NAME, ic.COLUMN_POSITION
235
+ FROM USER_INDEXES i
236
+ JOIN USER_IND_COLUMNS ic
237
+ ON i.INDEX_NAME = ic.INDEX_NAME
238
+ WHERE i.TABLE_NAME = :1
239
+ ORDER BY i.INDEX_NAME, ic.COLUMN_POSITION`, [tableName]);
240
+ const indexMap = new Map();
241
+ if (indexesResult.rows) {
242
+ for (const row of indexesResult.rows) {
243
+ const rowData = row;
244
+ const indexName = rowData.INDEX_NAME;
245
+ // 跳过主键索引
246
+ if (indexName.includes('PK_') || indexName.includes('SYS_')) {
247
+ continue;
248
+ }
249
+ if (!indexMap.has(indexName)) {
250
+ indexMap.set(indexName, {
251
+ columns: [],
252
+ unique: rowData.UNIQUENESS === 'UNIQUE',
253
+ });
254
+ }
255
+ indexMap.get(indexName).columns.push(rowData.COLUMN_NAME.toLowerCase());
256
+ }
257
+ }
258
+ const indexInfos = Array.from(indexMap.entries()).map(([name, info]) => ({
259
+ name,
260
+ columns: info.columns,
261
+ unique: info.unique,
262
+ }));
263
+ // 获取表行数估算
264
+ const rowCountResult = await this.connection.execute(`SELECT NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME = :1`, [tableName]);
265
+ const estimatedRows = rowCountResult.rows?.[0]
266
+ ? (rowCountResult.rows[0].NUM_ROWS || 0)
267
+ : 0;
268
+ return {
269
+ name: tableName.toLowerCase(),
270
+ columns: columnInfos,
271
+ primaryKeys,
272
+ indexes: indexInfos,
273
+ estimatedRows,
274
+ };
275
+ }
276
+ /**
277
+ * 格式化达梦数据类型
278
+ */
279
+ formatDMType(dataType, length, precision, scale) {
280
+ switch (dataType) {
281
+ case 'NUMBER':
282
+ case 'NUMERIC':
283
+ case 'DECIMAL':
284
+ if (precision !== null && precision !== undefined) {
285
+ if (scale !== null && scale !== undefined && scale > 0) {
286
+ return `${dataType}(${precision},${scale})`;
287
+ }
288
+ return `${dataType}(${precision})`;
289
+ }
290
+ return dataType;
291
+ case 'VARCHAR':
292
+ case 'VARCHAR2':
293
+ case 'CHAR':
294
+ if (length) {
295
+ return `${dataType}(${length})`;
296
+ }
297
+ return dataType;
298
+ case 'TIMESTAMP':
299
+ if (scale !== null && scale !== undefined) {
300
+ return `TIMESTAMP(${scale})`;
301
+ }
302
+ return 'TIMESTAMP';
303
+ default:
304
+ return dataType;
305
+ }
306
+ }
307
+ /**
308
+ * 检查是否为写操作
309
+ */
310
+ isWriteOperation(query) {
311
+ // 首先使用通用的写操作检测
312
+ if (checkWriteOperation(query)) {
313
+ return true;
314
+ }
315
+ // 添加达梦特定的写操作检测(类似 Oracle)
316
+ const trimmedQuery = query.trim().toUpperCase();
317
+ // MERGE 语句(达梦支持)
318
+ if (trimmedQuery.startsWith('MERGE')) {
319
+ return true;
320
+ }
321
+ // PL/SQL 块(达梦兼容 Oracle PL/SQL)
322
+ if (trimmedQuery.startsWith('BEGIN') || trimmedQuery.startsWith('DECLARE')) {
323
+ return true;
324
+ }
325
+ // CALL 存储过程
326
+ if (trimmedQuery.startsWith('CALL')) {
327
+ return true;
328
+ }
329
+ // 事务控制语句
330
+ if (trimmedQuery.startsWith('COMMIT') || trimmedQuery.startsWith('ROLLBACK')) {
331
+ return true;
332
+ }
333
+ return false;
334
+ }
335
+ }
336
+ //# sourceMappingURL=dm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dm.js","sourceRoot":"","sources":["../../src/adapters/dm.ts"],"names":[],"mappings":"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"}
@@ -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,14 @@ 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';
11
+ import { DMAdapter } from './adapters/dm.js';
10
12
  const program = new Command();
11
13
  program
12
14
  .name('universal-db-mcp')
13
15
  .description('MCP 数据库万能连接器 - 让 Claude Desktop 直接连接你的数据库')
14
16
  .version('0.1.0')
15
- .requiredOption('--type <type>', '数据库类型 (mysql|postgres|redis)')
17
+ .requiredOption('--type <type>', '数据库类型 (mysql|postgres|redis|oracle|dm)')
16
18
  .requiredOption('--host <host>', '数据库主机地址')
17
19
  .requiredOption('--port <port>', '数据库端口', parseInt)
18
20
  .option('--user <user>', '用户名')
@@ -22,8 +24,8 @@ program
22
24
  .action(async (options) => {
23
25
  try {
24
26
  // 验证数据库类型
25
- if (!['mysql', 'postgres', 'redis'].includes(options.type)) {
26
- console.error('❌ 错误: 不支持的数据库类型。支持的类型: mysql, postgres, redis');
27
+ if (!['mysql', 'postgres', 'redis', 'oracle', 'dm'].includes(options.type)) {
28
+ console.error('❌ 错误: 不支持的数据库类型。支持的类型: mysql, postgres, redis, oracle, dm');
27
29
  process.exit(1);
28
30
  }
29
31
  // 构建配置
@@ -73,6 +75,24 @@ program
73
75
  database: config.database,
74
76
  });
75
77
  break;
78
+ case 'oracle':
79
+ adapter = new OracleAdapter({
80
+ host: config.host,
81
+ port: config.port,
82
+ user: config.user,
83
+ password: config.password,
84
+ database: config.database,
85
+ });
86
+ break;
87
+ case 'dm':
88
+ adapter = new DMAdapter({
89
+ host: config.host,
90
+ port: config.port,
91
+ user: config.user,
92
+ password: config.password,
93
+ database: config.database,
94
+ });
95
+ break;
76
96
  default:
77
97
  throw new Error(`不支持的数据库类型: ${config.type}`);
78
98
  }
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' | 'dm';
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' | 'dm';
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,GAAG,IAAI,CAAC;IAC/D,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,GAAG,IAAI,CAAC;IACvD,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.3.0",
4
4
  "description": "MCP 数据库万能连接器 - 让 Claude Desktop 直接连接你的数据库",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -21,6 +21,9 @@
21
21
  "mysql",
22
22
  "postgresql",
23
23
  "redis",
24
+ "oracle",
25
+ "dameng",
26
+ "dm",
24
27
  "数据库",
25
28
  "AI"
26
29
  ],
@@ -43,17 +46,25 @@
43
46
  "commander": "^12.1.0",
44
47
  "ioredis": "^5.4.2",
45
48
  "mysql2": "^3.11.5",
49
+ "oracledb": "^6.7.0",
46
50
  "pg": "^8.13.1",
47
51
  "zod": "^3.24.1"
48
52
  },
49
53
  "devDependencies": {
50
54
  "@types/node": "^22.10.5",
55
+ "@types/oracledb": "^6.5.1",
51
56
  "@types/pg": "^8.11.10",
52
57
  "typescript": "^5.7.3"
53
58
  },
59
+ "optionalDependencies": {
60
+ "dmdb": "^1.0.46190"
61
+ },
54
62
  "engines": {
55
63
  "node": ">=20.0.0"
56
64
  },
65
+ "publishConfig": {
66
+ "access": "public"
67
+ },
57
68
  "repository": {
58
69
  "type": "git",
59
70
  "url": "https://github.com/Anarkh-Lee/universal-db-mcp.git"