universal-db-mcp 0.1.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 +93 -0
- package/DEPLOYMENT.md +411 -0
- package/EXAMPLES.md +362 -0
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/dist/adapters/mysql.d.ts +41 -0
- package/dist/adapters/mysql.d.ts.map +1 -0
- package/dist/adapters/mysql.js +173 -0
- package/dist/adapters/mysql.js.map +1 -0
- package/dist/adapters/postgres.d.ts +41 -0
- package/dist/adapters/postgres.d.ts.map +1 -0
- package/dist/adapters/postgres.js +210 -0
- package/dist/adapters/postgres.js.map +1 -0
- package/dist/adapters/redis.d.ts +53 -0
- package/dist/adapters/redis.d.ts.map +1 -0
- package/dist/adapters/redis.js +227 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +32 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +194 -0
- package/dist/server.js.map +1 -0
- package/dist/types/adapter.d.ts +114 -0
- package/dist/types/adapter.d.ts.map +1 -0
- package/dist/types/adapter.js +6 -0
- package/dist/types/adapter.js.map +1 -0
- package/dist/utils/safety.d.ts +24 -0
- package/dist/utils/safety.d.ts.map +1 -0
- package/dist/utils/safety.js +56 -0
- package/dist/utils/safety.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 数据库适配器接口
|
|
3
|
+
* 所有数据库实现都必须遵循此接口,确保统一的调用方式
|
|
4
|
+
*/
|
|
5
|
+
export interface DbAdapter {
|
|
6
|
+
/**
|
|
7
|
+
* 连接到数据库
|
|
8
|
+
* @throws 连接失败时抛出错误
|
|
9
|
+
*/
|
|
10
|
+
connect(): Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* 断开数据库连接
|
|
13
|
+
*/
|
|
14
|
+
disconnect(): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* 执行查询语句
|
|
17
|
+
* @param query - SQL 查询语句或 Redis 命令
|
|
18
|
+
* @param params - 查询参数(用于防止 SQL 注入)
|
|
19
|
+
* @returns 查询结果
|
|
20
|
+
*/
|
|
21
|
+
executeQuery(query: string, params?: unknown[]): Promise<QueryResult>;
|
|
22
|
+
/**
|
|
23
|
+
* 获取数据库结构信息
|
|
24
|
+
* @returns 数据库的表结构、索引等元数据
|
|
25
|
+
*/
|
|
26
|
+
getSchema(): Promise<SchemaInfo>;
|
|
27
|
+
/**
|
|
28
|
+
* 检查查询是否为写操作
|
|
29
|
+
* @param query - 待检查的查询语句
|
|
30
|
+
* @returns 如果是写操作返回 true
|
|
31
|
+
*/
|
|
32
|
+
isWriteOperation(query: string): boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 查询结果接口
|
|
36
|
+
*/
|
|
37
|
+
export interface QueryResult {
|
|
38
|
+
/** 查询返回的行数据 */
|
|
39
|
+
rows: Record<string, unknown>[];
|
|
40
|
+
/** 受影响的行数(用于 INSERT/UPDATE/DELETE) */
|
|
41
|
+
affectedRows?: number;
|
|
42
|
+
/** 执行时间(毫秒) */
|
|
43
|
+
executionTime?: number;
|
|
44
|
+
/** 额外的元数据 */
|
|
45
|
+
metadata?: Record<string, unknown>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 数据库结构信息
|
|
49
|
+
*/
|
|
50
|
+
export interface SchemaInfo {
|
|
51
|
+
/** 数据库类型 */
|
|
52
|
+
databaseType: 'mysql' | 'postgres' | 'redis';
|
|
53
|
+
/** 数据库名称 */
|
|
54
|
+
databaseName: string;
|
|
55
|
+
/** 表信息列表 */
|
|
56
|
+
tables: TableInfo[];
|
|
57
|
+
/** 数据库版本 */
|
|
58
|
+
version?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 表结构信息
|
|
62
|
+
*/
|
|
63
|
+
export interface TableInfo {
|
|
64
|
+
/** 表名 */
|
|
65
|
+
name: string;
|
|
66
|
+
/** 列信息 */
|
|
67
|
+
columns: ColumnInfo[];
|
|
68
|
+
/** 主键列名 */
|
|
69
|
+
primaryKeys: string[];
|
|
70
|
+
/** 索引信息 */
|
|
71
|
+
indexes?: IndexInfo[];
|
|
72
|
+
/** 预估行数 */
|
|
73
|
+
estimatedRows?: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 列信息
|
|
77
|
+
*/
|
|
78
|
+
export interface ColumnInfo {
|
|
79
|
+
/** 列名 */
|
|
80
|
+
name: string;
|
|
81
|
+
/** 数据类型 */
|
|
82
|
+
type: string;
|
|
83
|
+
/** 是否可为空 */
|
|
84
|
+
nullable: boolean;
|
|
85
|
+
/** 默认值 */
|
|
86
|
+
defaultValue?: string;
|
|
87
|
+
/** 注释说明 */
|
|
88
|
+
comment?: string;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 索引信息
|
|
92
|
+
*/
|
|
93
|
+
export interface IndexInfo {
|
|
94
|
+
/** 索引名称 */
|
|
95
|
+
name: string;
|
|
96
|
+
/** 索引列 */
|
|
97
|
+
columns: string[];
|
|
98
|
+
/** 是否唯一索引 */
|
|
99
|
+
unique: boolean;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 数据库连接配置
|
|
103
|
+
*/
|
|
104
|
+
export interface DbConfig {
|
|
105
|
+
type: 'mysql' | 'postgres' | 'redis';
|
|
106
|
+
host: string;
|
|
107
|
+
port: number;
|
|
108
|
+
user?: string;
|
|
109
|
+
password?: string;
|
|
110
|
+
database?: string;
|
|
111
|
+
/** 是否允许写操作(默认 false,只读模式) */
|
|
112
|
+
allowWrite?: boolean;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/types/adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 安全检查工具
|
|
3
|
+
* 用于防止误操作删库等危险行为
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 检查 SQL 语句是否包含写操作
|
|
7
|
+
* @param query - 待检查的 SQL 语句
|
|
8
|
+
* @returns 如果包含写操作返回 true
|
|
9
|
+
*/
|
|
10
|
+
export declare function isWriteOperation(query: string): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* 验证查询是否允许执行
|
|
13
|
+
* @param query - 待执行的查询
|
|
14
|
+
* @param allowWrite - 是否允许写操作
|
|
15
|
+
* @throws 如果查询被拒绝,抛出带有中文提示的错误
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateQuery(query: string, allowWrite: boolean): void;
|
|
18
|
+
/**
|
|
19
|
+
* 获取查询中的危险关键字(用于日志记录)
|
|
20
|
+
* @param query - SQL 查询语句
|
|
21
|
+
* @returns 找到的危险关键字数组
|
|
22
|
+
*/
|
|
23
|
+
export declare function getDangerousKeywords(query: string): string[];
|
|
24
|
+
//# sourceMappingURL=safety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/utils/safety.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAQvD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAStE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAK5D"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 安全检查工具
|
|
3
|
+
* 用于防止误操作删库等危险行为
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 危险的 SQL 关键字列表
|
|
7
|
+
* 这些操作会修改或删除数据
|
|
8
|
+
*/
|
|
9
|
+
const DANGEROUS_KEYWORDS = [
|
|
10
|
+
'DELETE',
|
|
11
|
+
'DROP',
|
|
12
|
+
'TRUNCATE',
|
|
13
|
+
'UPDATE',
|
|
14
|
+
'INSERT',
|
|
15
|
+
'ALTER',
|
|
16
|
+
'CREATE',
|
|
17
|
+
'RENAME',
|
|
18
|
+
'REPLACE',
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* 检查 SQL 语句是否包含写操作
|
|
22
|
+
* @param query - 待检查的 SQL 语句
|
|
23
|
+
* @returns 如果包含写操作返回 true
|
|
24
|
+
*/
|
|
25
|
+
export function isWriteOperation(query) {
|
|
26
|
+
const upperQuery = query.trim().toUpperCase();
|
|
27
|
+
return DANGEROUS_KEYWORDS.some(keyword => {
|
|
28
|
+
// 检查是否以该关键字开头(忽略前导空格和注释)
|
|
29
|
+
const pattern = new RegExp(`^(\\s|--.*|/\\*.*?\\*/)*${keyword}\\b`, 'i');
|
|
30
|
+
return pattern.test(upperQuery);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 验证查询是否允许执行
|
|
35
|
+
* @param query - 待执行的查询
|
|
36
|
+
* @param allowWrite - 是否允许写操作
|
|
37
|
+
* @throws 如果查询被拒绝,抛出带有中文提示的错误
|
|
38
|
+
*/
|
|
39
|
+
export function validateQuery(query, allowWrite) {
|
|
40
|
+
if (!allowWrite && isWriteOperation(query)) {
|
|
41
|
+
throw new Error('❌ 操作被拒绝:当前处于只读安全模式。\n' +
|
|
42
|
+
'检测到危险操作(DELETE/UPDATE/DROP/TRUNCATE 等)。\n' +
|
|
43
|
+
'如需执行写入操作,请在启动时添加 --danger-allow-write 参数。\n' +
|
|
44
|
+
'⚠️ 警告:启用写入模式后,AI 可以修改你的数据库,请谨慎使用!');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 获取查询中的危险关键字(用于日志记录)
|
|
49
|
+
* @param query - SQL 查询语句
|
|
50
|
+
* @returns 找到的危险关键字数组
|
|
51
|
+
*/
|
|
52
|
+
export function getDangerousKeywords(query) {
|
|
53
|
+
const upperQuery = query.trim().toUpperCase();
|
|
54
|
+
return DANGEROUS_KEYWORDS.filter(keyword => upperQuery.includes(keyword));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safety.js","sourceRoot":"","sources":["../../src/utils/safety.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,MAAM,kBAAkB,GAAG;IACzB,QAAQ;IACR,MAAM;IACN,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,SAAS;CACD,CAAC;AAEX;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE9C,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QACvC,yBAAyB;QACzB,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,2BAA2B,OAAO,KAAK,EAAE,GAAG,CAAC,CAAC;QACzE,OAAO,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,UAAmB;IAC9D,IAAI,CAAC,UAAU,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,uBAAuB;YACvB,2CAA2C;YAC3C,6CAA6C;YAC7C,oCAAoC,CACrC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,OAAO,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CACzC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC7B,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "universal-db-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP 数据库万能连接器 - 让 Claude Desktop 直接连接你的数据库",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"universal-db-mcp": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"prepare": "npm run build",
|
|
14
|
+
"start": "node dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"mcp",
|
|
18
|
+
"model-context-protocol",
|
|
19
|
+
"claude",
|
|
20
|
+
"database",
|
|
21
|
+
"mysql",
|
|
22
|
+
"postgresql",
|
|
23
|
+
"redis",
|
|
24
|
+
"数据库",
|
|
25
|
+
"AI"
|
|
26
|
+
],
|
|
27
|
+
"author": "Universal DB MCP Contributors",
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"files": [
|
|
30
|
+
"dist/**/*.js",
|
|
31
|
+
"dist/**/*.d.ts",
|
|
32
|
+
"dist/**/*.js.map",
|
|
33
|
+
"dist/**/*.d.ts.map",
|
|
34
|
+
"!dist/test.*",
|
|
35
|
+
"README.md",
|
|
36
|
+
"EXAMPLES.md",
|
|
37
|
+
"DEPLOYMENT.md",
|
|
38
|
+
"CONTRIBUTING.md",
|
|
39
|
+
"LICENSE"
|
|
40
|
+
],
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
43
|
+
"commander": "^12.1.0",
|
|
44
|
+
"ioredis": "^5.4.2",
|
|
45
|
+
"mysql2": "^3.11.5",
|
|
46
|
+
"pg": "^8.13.1",
|
|
47
|
+
"zod": "^3.24.1"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^22.10.5",
|
|
51
|
+
"@types/pg": "^8.11.10",
|
|
52
|
+
"typescript": "^5.7.3"
|
|
53
|
+
},
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=20.0.0"
|
|
56
|
+
},
|
|
57
|
+
"repository": {
|
|
58
|
+
"type": "git",
|
|
59
|
+
"url": "https://github.com/universal-db-mcp/universal-db-mcp.git"
|
|
60
|
+
},
|
|
61
|
+
"bugs": {
|
|
62
|
+
"url": "https://github.com/universal-db-mcp/universal-db-mcp/issues"
|
|
63
|
+
},
|
|
64
|
+
"homepage": "https://github.com/universal-db-mcp/universal-db-mcp#readme"
|
|
65
|
+
}
|