universal-db-mcp 0.1.0 → 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 +11 -2
- package/DEPLOYMENT.md +23 -1
- package/EXAMPLES.md +106 -0
- package/README.md +6 -4
- package/dist/adapters/oracle.d.ts +52 -0
- package/dist/adapters/oracle.d.ts.map +1 -0
- package/dist/adapters/oracle.js +342 -0
- package/dist/adapters/oracle.js.map +1 -0
- package/dist/index.js +13 -3
- package/dist/index.js.map +1 -1
- package/dist/types/adapter.d.ts +2 -2
- package/dist/types/adapter.d.ts.map +1 -1
- package/package.json +11 -5
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.
|
|
44
|
-
5.
|
|
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
|
-
│
|
|
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":";AAEA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CAAC,2CAA2C,CAAC;KACxD,OAAO,CAAC,OAAO,CAAC;KAChB,cAAc,CAAC,eAAe,EAAE,qCAAqC,CAAC;KACtE,cAAc,CAAC,eAAe,EAAE,SAAS,CAAC;KAC1C,cAAc,CAAC,eAAe,EAAE,OAAO,EAAE,QAAQ,CAAC;KAClD,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC;KAC9B,MAAM,CAAC,uBAAuB,EAAE,IAAI,CAAC;KACrC,MAAM,CAAC,uBAAuB,EAAE,OAAO,CAAC;KACxC,MAAM,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,KAAK,CAAC;KAC3D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,UAAU;QACV,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO;QACP,MAAM,MAAM,GAAa;YACvB,IAAI,EAAE,OAAO,CAAC,IAAiD;YAC/D,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,UAAU,EAAE,OAAO,CAAC,gBAAgB;SACrC,CAAC;QAEF,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,QAAQ,IAAI,MAAM,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAElB,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE7C,eAAe;QACf,IAAI,OAAkB,CAAC;QAEvB,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,OAAO;gBACV,OAAO,GAAG,IAAI,YAAY,CAAC;oBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;iBAC1B,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,UAAU;gBACb,OAAO,GAAG,IAAI,iBAAiB,CAAC;oBAC9B,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;iBAC1B,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,OAAO;gBACV,OAAO,GAAG,IAAI,YAAY,CAAC;oBACzB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;iBAC1B,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,QAAQ;gBACX,OAAO,GAAG,IAAI,aAAa,CAAC;oBAC1B,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;iBAC1B,CAAC,CAAC;gBACH,MAAM;YAER;gBACE,MAAM,IAAI,KAAK,CAAC,cAAc,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,cAAc;QACd,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAErB,SAAS;QACT,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;YAC9B,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;YAC/B,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IAEL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/types/adapter.d.ts
CHANGED
|
@@ -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;
|
|
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.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "MCP 数据库万能连接器 - 让 Claude Desktop 直接连接你的数据库",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -21,10 +21,11 @@
|
|
|
21
21
|
"mysql",
|
|
22
22
|
"postgresql",
|
|
23
23
|
"redis",
|
|
24
|
+
"oracle",
|
|
24
25
|
"数据库",
|
|
25
26
|
"AI"
|
|
26
27
|
],
|
|
27
|
-
"author": "
|
|
28
|
+
"author": "Anarkh-Lee",
|
|
28
29
|
"license": "MIT",
|
|
29
30
|
"files": [
|
|
30
31
|
"dist/**/*.js",
|
|
@@ -43,23 +44,28 @@
|
|
|
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
|
-
"url": "https://github.com/
|
|
65
|
+
"url": "https://github.com/Anarkh-Lee/universal-db-mcp.git"
|
|
60
66
|
},
|
|
61
67
|
"bugs": {
|
|
62
|
-
"url": "https://github.com/
|
|
68
|
+
"url": "https://github.com/Anarkh-Lee/universal-db-mcp/issues"
|
|
63
69
|
},
|
|
64
|
-
"homepage": "https://github.com/
|
|
70
|
+
"homepage": "https://github.com/Anarkh-Lee/universal-db-mcp#readme"
|
|
65
71
|
}
|