universal-db-mcp 0.3.1 → 0.4.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/EXAMPLES.md +113 -0
- package/README.md +2 -1
- package/dist/adapters/sqlserver.d.ts +46 -0
- package/dist/adapters/sqlserver.d.ts.map +1 -0
- package/dist/adapters/sqlserver.js +346 -0
- package/dist/adapters/sqlserver.js.map +1 -0
- package/dist/index.js +19 -4
- 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 +6 -1
package/EXAMPLES.md
CHANGED
|
@@ -351,6 +351,119 @@ npm install -g dmdb
|
|
|
351
351
|
|
|
352
352
|
---
|
|
353
353
|
|
|
354
|
+
## SQL Server 使用示例
|
|
355
|
+
|
|
356
|
+
### 基础配置(只读模式)
|
|
357
|
+
|
|
358
|
+
```json
|
|
359
|
+
{
|
|
360
|
+
"mcpServers": {
|
|
361
|
+
"sqlserver-db": {
|
|
362
|
+
"command": "npx",
|
|
363
|
+
"args": [
|
|
364
|
+
"universal-db-mcp",
|
|
365
|
+
"--type", "sqlserver",
|
|
366
|
+
"--host", "localhost",
|
|
367
|
+
"--port", "1433",
|
|
368
|
+
"--user", "sa",
|
|
369
|
+
"--password", "YourPassword123",
|
|
370
|
+
"--database", "master"
|
|
371
|
+
]
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
**提示**: 也可以使用 `--type mssql` 作为别名。
|
|
378
|
+
|
|
379
|
+
### 启用写入模式
|
|
380
|
+
|
|
381
|
+
```json
|
|
382
|
+
{
|
|
383
|
+
"mcpServers": {
|
|
384
|
+
"sqlserver-write": {
|
|
385
|
+
"command": "npx",
|
|
386
|
+
"args": [
|
|
387
|
+
"universal-db-mcp",
|
|
388
|
+
"--type", "sqlserver",
|
|
389
|
+
"--host", "localhost",
|
|
390
|
+
"--port", "1433",
|
|
391
|
+
"--user", "sa",
|
|
392
|
+
"--password", "YourPassword123",
|
|
393
|
+
"--database", "MyDatabase",
|
|
394
|
+
"--danger-allow-write"
|
|
395
|
+
]
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### 连接 Azure SQL Database
|
|
402
|
+
|
|
403
|
+
```json
|
|
404
|
+
{
|
|
405
|
+
"mcpServers": {
|
|
406
|
+
"azure-sql": {
|
|
407
|
+
"command": "npx",
|
|
408
|
+
"args": [
|
|
409
|
+
"universal-db-mcp",
|
|
410
|
+
"--type", "sqlserver",
|
|
411
|
+
"--host", "myserver.database.windows.net",
|
|
412
|
+
"--port", "1433",
|
|
413
|
+
"--user", "myadmin",
|
|
414
|
+
"--password", "MyPassword123!",
|
|
415
|
+
"--database", "mydatabase"
|
|
416
|
+
]
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
**注意**: 连接 Azure SQL Database 时会自动启用加密连接。
|
|
423
|
+
|
|
424
|
+
### 与 Claude 对话示例
|
|
425
|
+
|
|
426
|
+
**用户**: 查看数据库中有哪些表?
|
|
427
|
+
|
|
428
|
+
**Claude 会自动**:
|
|
429
|
+
|
|
430
|
+
1. 调用 `get_schema` 工具
|
|
431
|
+
2. 执行查询: `SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'`
|
|
432
|
+
3. 返回表列表
|
|
433
|
+
|
|
434
|
+
**用户**: 查看 Users 表的结构
|
|
435
|
+
|
|
436
|
+
**Claude 会自动**:
|
|
437
|
+
|
|
438
|
+
1. 调用 `get_table_info` 工具
|
|
439
|
+
2. 返回列信息、主键、索引等详细信息
|
|
440
|
+
|
|
441
|
+
**用户**: 统计每个部门的员工数量
|
|
442
|
+
|
|
443
|
+
**Claude 会自动**:
|
|
444
|
+
|
|
445
|
+
1. 理解需求
|
|
446
|
+
2. 生成 SQL: `SELECT DepartmentID, COUNT(*) as EmployeeCount FROM Employees GROUP BY DepartmentID ORDER BY EmployeeCount DESC`
|
|
447
|
+
3. 执行并返回结果
|
|
448
|
+
|
|
449
|
+
**用户**: 查找最近一周创建的订单
|
|
450
|
+
|
|
451
|
+
**Claude 会自动**:
|
|
452
|
+
|
|
453
|
+
1. 生成 SQL: `SELECT * FROM Orders WHERE CreatedDate >= DATEADD(day, -7, GETDATE()) ORDER BY CreatedDate DESC`
|
|
454
|
+
2. 执行并返回结果
|
|
455
|
+
|
|
456
|
+
### 注意事项
|
|
457
|
+
|
|
458
|
+
1. **默认端口**: SQL Server 默认端口为 1433
|
|
459
|
+
2. **身份验证**: 支持 SQL Server 身份验证(用户名/密码)
|
|
460
|
+
3. **加密连接**: 连接 Azure SQL 时会自动启用加密,本地 SQL Server 默认不加密
|
|
461
|
+
4. **数据库名**: 必须指定数据库名(如 master、tempdb 或自定义数据库)
|
|
462
|
+
5. **权限**: 确保用户有足够的权限访问系统视图(INFORMATION_SCHEMA)
|
|
463
|
+
6. **参数化查询**: 支持 `?` 占位符,会自动转换为 SQL Server 的 `@param0` 语法
|
|
464
|
+
|
|
465
|
+
---
|
|
466
|
+
|
|
354
467
|
## Claude Desktop 配置示例
|
|
355
468
|
|
|
356
469
|
### 同时连接多个数据库
|
package/README.md
CHANGED
|
@@ -113,6 +113,7 @@ Claude 会自动调用数据库工具完成查询!
|
|
|
113
113
|
| Redis | `--type redis` | 6379 | ✅ 已支持 | - |
|
|
114
114
|
| Oracle(12c以上) | `--type oracle` | 1521 | ✅ 已支持 | - |
|
|
115
115
|
| 达梦(DM7/DM8) | `--type dm` | 5236 | ✅ 已支持 | 驱动自动安装 |
|
|
116
|
+
| SQL Server (2012+) | `--type sqlserver` 或 `--type mssql` | 1433 | ✅ 已支持 | 支持 Azure SQL Database |
|
|
116
117
|
| MongoDB | `--type mongo` | - | 🚧 计划中 | - |
|
|
117
118
|
| SQLite | `--type sqlite` | - | 🚧 计划中 | - |
|
|
118
119
|
|
|
@@ -124,7 +125,7 @@ Claude 会自动调用数据库工具完成查询!
|
|
|
124
125
|
universal-db-mcp [选项]
|
|
125
126
|
|
|
126
127
|
选项:
|
|
127
|
-
--type <db> 数据库类型 (mysql|postgres|redis|oracle|dm)
|
|
128
|
+
--type <db> 数据库类型 (mysql|postgres|redis|oracle|dm|sqlserver|mssql)
|
|
128
129
|
--host <host> 数据库主机地址 (默认: localhost)
|
|
129
130
|
--port <port> 数据库端口
|
|
130
131
|
--user <user> 用户名
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL Server 数据库适配器
|
|
3
|
+
* 使用 mssql 驱动实现 DbAdapter 接口
|
|
4
|
+
* 支持 SQL Server 2012+ 和 Azure SQL Database
|
|
5
|
+
*/
|
|
6
|
+
import type { DbAdapter, QueryResult, SchemaInfo } from '../types/adapter.js';
|
|
7
|
+
export declare class SQLServerAdapter implements DbAdapter {
|
|
8
|
+
private pool;
|
|
9
|
+
private config;
|
|
10
|
+
constructor(config: {
|
|
11
|
+
host: string;
|
|
12
|
+
port: number;
|
|
13
|
+
user?: string;
|
|
14
|
+
password?: string;
|
|
15
|
+
database?: string;
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* 连接到 SQL Server 数据库
|
|
19
|
+
*/
|
|
20
|
+
connect(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* 断开数据库连接
|
|
23
|
+
*/
|
|
24
|
+
disconnect(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* 执行 SQL 查询
|
|
27
|
+
*/
|
|
28
|
+
executeQuery(query: string, params?: unknown[]): Promise<QueryResult>;
|
|
29
|
+
/**
|
|
30
|
+
* 获取数据库结构信息
|
|
31
|
+
*/
|
|
32
|
+
getSchema(): Promise<SchemaInfo>;
|
|
33
|
+
/**
|
|
34
|
+
* 获取单个表的详细信息
|
|
35
|
+
*/
|
|
36
|
+
private getTableInfo;
|
|
37
|
+
/**
|
|
38
|
+
* 格式化 SQL Server 数据类型
|
|
39
|
+
*/
|
|
40
|
+
private formatSQLServerType;
|
|
41
|
+
/**
|
|
42
|
+
* 检查是否为写操作
|
|
43
|
+
*/
|
|
44
|
+
isWriteOperation(query: string): boolean;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=sqlserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlserver.d.ts","sourceRoot":"","sources":["../../src/adapters/sqlserver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,UAAU,EAIX,MAAM,qBAAqB,CAAC;AAG7B,qBAAa,gBAAiB,YAAW,SAAS;IAChD,OAAO,CAAC,IAAI,CAAmC;IAC/C,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;IA2C9B;;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;IAkE3E;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IA+CtC;;OAEG;YACW,YAAY;IAkH1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA0C3B;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CA6BzC"}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL Server 数据库适配器
|
|
3
|
+
* 使用 mssql 驱动实现 DbAdapter 接口
|
|
4
|
+
* 支持 SQL Server 2012+ 和 Azure SQL Database
|
|
5
|
+
*/
|
|
6
|
+
import sql from 'mssql';
|
|
7
|
+
import { isWriteOperation as checkWriteOperation } from '../utils/safety.js';
|
|
8
|
+
export class SQLServerAdapter {
|
|
9
|
+
pool = null;
|
|
10
|
+
config;
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.config = config;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 连接到 SQL Server 数据库
|
|
16
|
+
*/
|
|
17
|
+
async connect() {
|
|
18
|
+
try {
|
|
19
|
+
// 检测是否为 Azure SQL Database
|
|
20
|
+
const isAzure = this.config.host.includes('.database.windows.net');
|
|
21
|
+
const poolConfig = {
|
|
22
|
+
server: this.config.host,
|
|
23
|
+
port: this.config.port || 1433,
|
|
24
|
+
user: this.config.user,
|
|
25
|
+
password: this.config.password,
|
|
26
|
+
database: this.config.database,
|
|
27
|
+
options: {
|
|
28
|
+
encrypt: isAzure, // Azure SQL 需要加密
|
|
29
|
+
trustServerCertificate: !isAzure, // 仅本地开发信任证书
|
|
30
|
+
enableArithAbort: true,
|
|
31
|
+
},
|
|
32
|
+
pool: {
|
|
33
|
+
max: 10,
|
|
34
|
+
min: 0,
|
|
35
|
+
idleTimeoutMillis: 30000,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
this.pool = await sql.connect(poolConfig);
|
|
39
|
+
// 测试连接
|
|
40
|
+
await this.pool.request().query('SELECT 1');
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
// 翻译常见错误
|
|
44
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
45
|
+
if (error.number === 18456) {
|
|
46
|
+
throw new Error('SQL Server 连接失败: 身份验证失败,请检查用户名和密码');
|
|
47
|
+
}
|
|
48
|
+
else if (errorMessage.includes('ECONNREFUSED') || errorMessage.includes('ETIMEDOUT')) {
|
|
49
|
+
throw new Error('SQL Server 连接失败: 无法连接到数据库服务器,请检查主机地址和端口');
|
|
50
|
+
}
|
|
51
|
+
else if (errorMessage.includes('database') && errorMessage.includes('does not exist')) {
|
|
52
|
+
throw new Error('SQL Server 连接失败: 数据库不存在');
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`SQL Server 连接失败: ${errorMessage}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 断开数据库连接
|
|
59
|
+
*/
|
|
60
|
+
async disconnect() {
|
|
61
|
+
if (this.pool) {
|
|
62
|
+
try {
|
|
63
|
+
await this.pool.close(); // 正确关闭连接池,排空所有连接
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.error('关闭连接池时出错:', error);
|
|
67
|
+
}
|
|
68
|
+
this.pool = null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 执行 SQL 查询
|
|
73
|
+
*/
|
|
74
|
+
async executeQuery(query, params) {
|
|
75
|
+
if (!this.pool) {
|
|
76
|
+
throw new Error('数据库未连接');
|
|
77
|
+
}
|
|
78
|
+
const startTime = Date.now();
|
|
79
|
+
try {
|
|
80
|
+
const request = this.pool.request();
|
|
81
|
+
// 处理参数 - SQL Server 使用 @param0, @param1 语法
|
|
82
|
+
if (params && params.length > 0) {
|
|
83
|
+
params.forEach((param, index) => {
|
|
84
|
+
request.input(`param${index}`, param);
|
|
85
|
+
});
|
|
86
|
+
// 替换 ? 占位符为 @param0, @param1, ...
|
|
87
|
+
let paramIndex = 0;
|
|
88
|
+
query = query.replace(/\?/g, () => `@param${paramIndex++}`);
|
|
89
|
+
}
|
|
90
|
+
const result = await request.query(query);
|
|
91
|
+
const executionTime = Date.now() - startTime;
|
|
92
|
+
// 处理 SELECT 查询
|
|
93
|
+
if (result.recordset && result.recordset.length > 0) {
|
|
94
|
+
return {
|
|
95
|
+
rows: result.recordset,
|
|
96
|
+
executionTime,
|
|
97
|
+
metadata: {
|
|
98
|
+
columnCount: Object.keys(result.recordset[0]).length,
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// 处理 DML 操作 (INSERT/UPDATE/DELETE)
|
|
103
|
+
if (result.rowsAffected && result.rowsAffected.length > 0) {
|
|
104
|
+
const affectedRows = result.rowsAffected.reduce((sum, count) => sum + count, 0);
|
|
105
|
+
return {
|
|
106
|
+
rows: [],
|
|
107
|
+
affectedRows,
|
|
108
|
+
executionTime,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// 其他操作或空结果
|
|
112
|
+
return {
|
|
113
|
+
rows: [],
|
|
114
|
+
executionTime,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
// 翻译常见 SQL Server 错误
|
|
119
|
+
if (error.number === 208) {
|
|
120
|
+
throw new Error('查询执行失败: 表或视图不存在');
|
|
121
|
+
}
|
|
122
|
+
else if (error.number === 2627 || error.number === 2601) {
|
|
123
|
+
throw new Error('查询执行失败: 违反唯一约束');
|
|
124
|
+
}
|
|
125
|
+
else if (error.number === 547) {
|
|
126
|
+
throw new Error('查询执行失败: 违反外键约束');
|
|
127
|
+
}
|
|
128
|
+
else if (error.number === 18456) {
|
|
129
|
+
throw new Error('查询执行失败: 身份验证失败');
|
|
130
|
+
}
|
|
131
|
+
throw new Error(`查询执行失败: ${error.message || String(error)}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 获取数据库结构信息
|
|
136
|
+
*/
|
|
137
|
+
async getSchema() {
|
|
138
|
+
if (!this.pool) {
|
|
139
|
+
throw new Error('数据库未连接');
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
// 获取 SQL Server 版本
|
|
143
|
+
const versionResult = await this.pool.request().query('SELECT @@VERSION AS version');
|
|
144
|
+
const version = versionResult.recordset?.[0]?.version || 'unknown';
|
|
145
|
+
// 获取数据库名
|
|
146
|
+
const dbNameResult = await this.pool.request().query('SELECT DB_NAME() AS database_name');
|
|
147
|
+
const databaseName = dbNameResult.recordset?.[0]?.database_name || 'unknown';
|
|
148
|
+
// 获取所有表(过滤系统表)
|
|
149
|
+
const tablesResult = await this.pool.request().query(`
|
|
150
|
+
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE
|
|
151
|
+
FROM INFORMATION_SCHEMA.TABLES
|
|
152
|
+
WHERE TABLE_TYPE = 'BASE TABLE'
|
|
153
|
+
AND TABLE_SCHEMA NOT IN ('sys', 'INFORMATION_SCHEMA')
|
|
154
|
+
AND TABLE_SCHEMA = SCHEMA_NAME()
|
|
155
|
+
ORDER BY TABLE_SCHEMA, TABLE_NAME
|
|
156
|
+
`);
|
|
157
|
+
const tableInfos = [];
|
|
158
|
+
if (tablesResult.recordset) {
|
|
159
|
+
for (const tableRow of tablesResult.recordset) {
|
|
160
|
+
const tableName = tableRow.TABLE_NAME;
|
|
161
|
+
const tableInfo = await this.getTableInfo(tableName);
|
|
162
|
+
tableInfos.push(tableInfo);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
databaseType: 'sqlserver',
|
|
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.pool) {
|
|
181
|
+
throw new Error('数据库未连接');
|
|
182
|
+
}
|
|
183
|
+
// 获取列信息
|
|
184
|
+
const columnsResult = await this.pool.request()
|
|
185
|
+
.input('param0', tableName)
|
|
186
|
+
.query(`
|
|
187
|
+
SELECT
|
|
188
|
+
c.COLUMN_NAME,
|
|
189
|
+
c.DATA_TYPE,
|
|
190
|
+
c.CHARACTER_MAXIMUM_LENGTH,
|
|
191
|
+
c.NUMERIC_PRECISION,
|
|
192
|
+
c.NUMERIC_SCALE,
|
|
193
|
+
c.IS_NULLABLE,
|
|
194
|
+
c.COLUMN_DEFAULT
|
|
195
|
+
FROM INFORMATION_SCHEMA.COLUMNS c
|
|
196
|
+
WHERE c.TABLE_NAME = @param0
|
|
197
|
+
AND c.TABLE_SCHEMA = SCHEMA_NAME()
|
|
198
|
+
ORDER BY c.ORDINAL_POSITION
|
|
199
|
+
`);
|
|
200
|
+
const columnInfos = [];
|
|
201
|
+
if (columnsResult.recordset) {
|
|
202
|
+
for (const col of columnsResult.recordset) {
|
|
203
|
+
columnInfos.push({
|
|
204
|
+
name: col.COLUMN_NAME.toLowerCase(),
|
|
205
|
+
type: this.formatSQLServerType(col.DATA_TYPE, col.CHARACTER_MAXIMUM_LENGTH, col.NUMERIC_PRECISION, col.NUMERIC_SCALE),
|
|
206
|
+
nullable: col.IS_NULLABLE === 'YES',
|
|
207
|
+
defaultValue: col.COLUMN_DEFAULT?.trim() || undefined,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// 获取主键
|
|
212
|
+
const primaryKeysResult = await this.pool.request()
|
|
213
|
+
.input('param0', tableName)
|
|
214
|
+
.query(`
|
|
215
|
+
SELECT c.COLUMN_NAME
|
|
216
|
+
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
|
|
217
|
+
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE c
|
|
218
|
+
ON tc.CONSTRAINT_NAME = c.CONSTRAINT_NAME
|
|
219
|
+
WHERE tc.TABLE_NAME = @param0
|
|
220
|
+
AND tc.TABLE_SCHEMA = SCHEMA_NAME()
|
|
221
|
+
AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
|
|
222
|
+
ORDER BY c.ORDINAL_POSITION
|
|
223
|
+
`);
|
|
224
|
+
const primaryKeys = [];
|
|
225
|
+
if (primaryKeysResult.recordset) {
|
|
226
|
+
for (const row of primaryKeysResult.recordset) {
|
|
227
|
+
primaryKeys.push(row.COLUMN_NAME.toLowerCase());
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// 获取索引信息
|
|
231
|
+
const indexesResult = await this.pool.request()
|
|
232
|
+
.input('param0', tableName)
|
|
233
|
+
.query(`
|
|
234
|
+
SELECT
|
|
235
|
+
i.name AS index_name,
|
|
236
|
+
STRING_AGG(c.name, ', ') WITHIN GROUP (ORDER BY ic.key_ordinal) AS column_names,
|
|
237
|
+
i.is_unique
|
|
238
|
+
FROM sys.indexes i
|
|
239
|
+
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
|
|
240
|
+
INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
|
241
|
+
WHERE i.object_id = OBJECT_ID(@param0)
|
|
242
|
+
AND i.is_primary_key = 0
|
|
243
|
+
AND i.type > 0
|
|
244
|
+
GROUP BY i.name, i.is_unique
|
|
245
|
+
ORDER BY i.name
|
|
246
|
+
`);
|
|
247
|
+
const indexInfos = [];
|
|
248
|
+
if (indexesResult.recordset) {
|
|
249
|
+
for (const row of indexesResult.recordset) {
|
|
250
|
+
const columns = row.column_names.split(', ').map((col) => col.toLowerCase());
|
|
251
|
+
indexInfos.push({
|
|
252
|
+
name: row.index_name,
|
|
253
|
+
columns,
|
|
254
|
+
unique: row.is_unique,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// 获取行数估算
|
|
259
|
+
const rowCountResult = await this.pool.request()
|
|
260
|
+
.input('param0', tableName)
|
|
261
|
+
.query(`
|
|
262
|
+
SELECT SUM(p.rows) AS row_count
|
|
263
|
+
FROM sys.partitions p
|
|
264
|
+
JOIN sys.tables t ON p.object_id = t.object_id
|
|
265
|
+
WHERE t.name = @param0
|
|
266
|
+
AND t.schema_id = SCHEMA_ID()
|
|
267
|
+
AND p.index_id IN (0, 1)
|
|
268
|
+
`);
|
|
269
|
+
const estimatedRows = rowCountResult.recordset?.[0]?.row_count || 0;
|
|
270
|
+
return {
|
|
271
|
+
name: tableName.toLowerCase(),
|
|
272
|
+
columns: columnInfos,
|
|
273
|
+
primaryKeys,
|
|
274
|
+
indexes: indexInfos,
|
|
275
|
+
estimatedRows,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* 格式化 SQL Server 数据类型
|
|
280
|
+
*/
|
|
281
|
+
formatSQLServerType(dataType, length, precision, scale) {
|
|
282
|
+
switch (dataType.toUpperCase()) {
|
|
283
|
+
case 'NVARCHAR':
|
|
284
|
+
case 'VARCHAR':
|
|
285
|
+
case 'NCHAR':
|
|
286
|
+
case 'CHAR':
|
|
287
|
+
if (length === -1)
|
|
288
|
+
return `${dataType}(MAX)`;
|
|
289
|
+
if (length)
|
|
290
|
+
return `${dataType}(${length})`;
|
|
291
|
+
return dataType;
|
|
292
|
+
case 'DECIMAL':
|
|
293
|
+
case 'NUMERIC':
|
|
294
|
+
if (precision && scale !== undefined && scale !== null) {
|
|
295
|
+
return `${dataType}(${precision},${scale})`;
|
|
296
|
+
}
|
|
297
|
+
if (precision)
|
|
298
|
+
return `${dataType}(${precision})`;
|
|
299
|
+
return dataType;
|
|
300
|
+
case 'DATETIME2':
|
|
301
|
+
case 'DATETIMEOFFSET':
|
|
302
|
+
case 'TIME':
|
|
303
|
+
if (scale !== undefined && scale !== null) {
|
|
304
|
+
return `${dataType}(${scale})`;
|
|
305
|
+
}
|
|
306
|
+
return dataType;
|
|
307
|
+
case 'VARBINARY':
|
|
308
|
+
case 'BINARY':
|
|
309
|
+
if (length === -1)
|
|
310
|
+
return `${dataType}(MAX)`;
|
|
311
|
+
if (length)
|
|
312
|
+
return `${dataType}(${length})`;
|
|
313
|
+
return dataType;
|
|
314
|
+
default:
|
|
315
|
+
return dataType;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* 检查是否为写操作
|
|
320
|
+
*/
|
|
321
|
+
isWriteOperation(query) {
|
|
322
|
+
// 首先使用通用的写操作检测
|
|
323
|
+
if (checkWriteOperation(query)) {
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
326
|
+
// SQL Server 特定的写操作检测
|
|
327
|
+
const trimmedQuery = query.trim().toUpperCase();
|
|
328
|
+
// MERGE 语句(SQL Server 的 upsert 操作)
|
|
329
|
+
if (trimmedQuery.startsWith('MERGE')) {
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
// 存储过程执行
|
|
333
|
+
if (trimmedQuery.startsWith('EXEC') || trimmedQuery.startsWith('EXECUTE')) {
|
|
334
|
+
return true;
|
|
335
|
+
}
|
|
336
|
+
// 事务控制语句
|
|
337
|
+
if (trimmedQuery.startsWith('BEGIN TRANSACTION') ||
|
|
338
|
+
trimmedQuery.startsWith('BEGIN TRAN') ||
|
|
339
|
+
trimmedQuery.startsWith('COMMIT') ||
|
|
340
|
+
trimmedQuery.startsWith('ROLLBACK')) {
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
return false;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=sqlserver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlserver.js","sourceRoot":"","sources":["../../src/adapters/sqlserver.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -9,12 +9,13 @@ import { PostgreSQLAdapter } from './adapters/postgres.js';
|
|
|
9
9
|
import { RedisAdapter } from './adapters/redis.js';
|
|
10
10
|
import { OracleAdapter } from './adapters/oracle.js';
|
|
11
11
|
import { DMAdapter } from './adapters/dm.js';
|
|
12
|
+
import { SQLServerAdapter } from './adapters/sqlserver.js';
|
|
12
13
|
const program = new Command();
|
|
13
14
|
program
|
|
14
15
|
.name('universal-db-mcp')
|
|
15
16
|
.description('MCP 数据库万能连接器 - 让 Claude Desktop 直接连接你的数据库')
|
|
16
17
|
.version('0.1.0')
|
|
17
|
-
.requiredOption('--type <type>', '数据库类型 (mysql|postgres|redis|oracle|dm)')
|
|
18
|
+
.requiredOption('--type <type>', '数据库类型 (mysql|postgres|redis|oracle|dm|sqlserver|mssql)')
|
|
18
19
|
.requiredOption('--host <host>', '数据库主机地址')
|
|
19
20
|
.requiredOption('--port <port>', '数据库端口', parseInt)
|
|
20
21
|
.option('--user <user>', '用户名')
|
|
@@ -24,13 +25,18 @@ program
|
|
|
24
25
|
.action(async (options) => {
|
|
25
26
|
try {
|
|
26
27
|
// 验证数据库类型
|
|
27
|
-
if (!['mysql', 'postgres', 'redis', 'oracle', 'dm'].includes(options.type)) {
|
|
28
|
-
console.error('❌ 错误: 不支持的数据库类型。支持的类型: mysql, postgres, redis, oracle, dm');
|
|
28
|
+
if (!['mysql', 'postgres', 'redis', 'oracle', 'dm', 'sqlserver', 'mssql'].includes(options.type)) {
|
|
29
|
+
console.error('❌ 错误: 不支持的数据库类型。支持的类型: mysql, postgres, redis, oracle, dm, sqlserver (或 mssql)');
|
|
29
30
|
process.exit(1);
|
|
30
31
|
}
|
|
32
|
+
// 规范化 SQL Server 别名
|
|
33
|
+
let dbType = options.type;
|
|
34
|
+
if (dbType === 'mssql') {
|
|
35
|
+
dbType = 'sqlserver';
|
|
36
|
+
}
|
|
31
37
|
// 构建配置
|
|
32
38
|
const config = {
|
|
33
|
-
type:
|
|
39
|
+
type: dbType,
|
|
34
40
|
host: options.host,
|
|
35
41
|
port: options.port,
|
|
36
42
|
user: options.user,
|
|
@@ -93,6 +99,15 @@ program
|
|
|
93
99
|
database: config.database,
|
|
94
100
|
});
|
|
95
101
|
break;
|
|
102
|
+
case 'sqlserver':
|
|
103
|
+
adapter = new SQLServerAdapter({
|
|
104
|
+
host: config.host,
|
|
105
|
+
port: config.port,
|
|
106
|
+
user: config.user,
|
|
107
|
+
password: config.password,
|
|
108
|
+
database: config.database,
|
|
109
|
+
});
|
|
110
|
+
break;
|
|
96
111
|
default:
|
|
97
112
|
throw new Error(`不支持的数据库类型: ${config.type}`);
|
|
98
113
|
}
|
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;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
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' | 'oracle' | 'dm';
|
|
52
|
+
databaseType: 'mysql' | 'postgres' | 'redis' | 'oracle' | 'dm' | 'sqlserver';
|
|
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' | 'oracle' | 'dm';
|
|
105
|
+
type: 'mysql' | 'postgres' | 'redis' | 'oracle' | 'dm' | 'sqlserver';
|
|
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,GAAG,QAAQ,GAAG,IAAI,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,GAAG,IAAI,GAAG,WAAW,CAAC;IAC7E,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,GAAG,WAAW,CAAC;IACrE,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.4.0",
|
|
4
4
|
"description": "MCP 数据库万能连接器 - 让 Claude Desktop 直接连接你的数据库",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -24,6 +24,9 @@
|
|
|
24
24
|
"oracle",
|
|
25
25
|
"dameng",
|
|
26
26
|
"dm",
|
|
27
|
+
"sqlserver",
|
|
28
|
+
"mssql",
|
|
29
|
+
"sql-server",
|
|
27
30
|
"数据库",
|
|
28
31
|
"AI"
|
|
29
32
|
],
|
|
@@ -45,12 +48,14 @@
|
|
|
45
48
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
46
49
|
"commander": "^12.1.0",
|
|
47
50
|
"ioredis": "^5.4.2",
|
|
51
|
+
"mssql": "^12.2.0",
|
|
48
52
|
"mysql2": "^3.11.5",
|
|
49
53
|
"oracledb": "^6.7.0",
|
|
50
54
|
"pg": "^8.13.1",
|
|
51
55
|
"zod": "^3.24.1"
|
|
52
56
|
},
|
|
53
57
|
"devDependencies": {
|
|
58
|
+
"@types/mssql": "^9.1.5",
|
|
54
59
|
"@types/node": "^22.10.5",
|
|
55
60
|
"@types/oracledb": "^6.5.1",
|
|
56
61
|
"@types/pg": "^8.11.10",
|