@pero-mcp/postgresql 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/LICENSE +21 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +11 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +39 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +466 -0
- package/dist/server.js.map +1 -0
- package/package.json +45 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pero Games
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { PostgreSQLMCPServer } from './server.js';
|
|
3
|
+
async function main() {
|
|
4
|
+
const server = new PostgreSQLMCPServer();
|
|
5
|
+
await server.runStdio();
|
|
6
|
+
}
|
|
7
|
+
main().catch((error) => {
|
|
8
|
+
console.error('Failed to start PostgreSQL MCP server:', error);
|
|
9
|
+
process.exit(1);
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;IACzC,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { BaseMCPServer } from '@pero-mcp/core';
|
|
2
|
+
/**
|
|
3
|
+
* PostgreSQL MCP Server
|
|
4
|
+
* 提供数据库分析、建表、数据导入、查询等功能
|
|
5
|
+
*/
|
|
6
|
+
export declare class PostgreSQLMCPServer extends BaseMCPServer {
|
|
7
|
+
private pool?;
|
|
8
|
+
constructor();
|
|
9
|
+
protected initialize(): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* 分析文件结构(CSV/TSV,支持 gzip)
|
|
12
|
+
*/
|
|
13
|
+
private registerAnalyzeFile;
|
|
14
|
+
/**
|
|
15
|
+
* 创建表
|
|
16
|
+
*/
|
|
17
|
+
private registerCreateTable;
|
|
18
|
+
/**
|
|
19
|
+
* 导入数据(批量)
|
|
20
|
+
*/
|
|
21
|
+
private registerImportData;
|
|
22
|
+
/**
|
|
23
|
+
* 执行查询
|
|
24
|
+
*/
|
|
25
|
+
private registerQuery;
|
|
26
|
+
/**
|
|
27
|
+
* 批量插入
|
|
28
|
+
*/
|
|
29
|
+
private registerBulkInsert;
|
|
30
|
+
/**
|
|
31
|
+
* 列出表
|
|
32
|
+
*/
|
|
33
|
+
private registerListTables;
|
|
34
|
+
private inferColumnType;
|
|
35
|
+
private generateCreateTableSQL;
|
|
36
|
+
private executeBatchInsert;
|
|
37
|
+
cleanup(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAQ/C;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,OAAO,CAAC,IAAI,CAAC,CAAO;;cAMJ,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC3C;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwG3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA0E3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkI1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAsDrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2D1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwC1B,OAAO,CAAC,eAAe;IAmDvB,OAAO,CAAC,sBAAsB;YAiBhB,kBAAkB;IAwB1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import { BaseMCPServer } from '@pero-mcp/core';
|
|
2
|
+
import { requireEnv, ValidationError } from '@pero-mcp/shared';
|
|
3
|
+
import { Pool } from 'pg';
|
|
4
|
+
import { readFileSync, createReadStream } from 'fs';
|
|
5
|
+
import { createGunzip } from 'zlib';
|
|
6
|
+
import { createInterface } from 'readline';
|
|
7
|
+
/**
|
|
8
|
+
* PostgreSQL MCP Server
|
|
9
|
+
* 提供数据库分析、建表、数据导入、查询等功能
|
|
10
|
+
*/
|
|
11
|
+
export class PostgreSQLMCPServer extends BaseMCPServer {
|
|
12
|
+
pool;
|
|
13
|
+
constructor() {
|
|
14
|
+
super('postgresql-mcp', '0.1.0');
|
|
15
|
+
}
|
|
16
|
+
async initialize() {
|
|
17
|
+
// 从环境变量获取数据库连接信息
|
|
18
|
+
const connectionString = process.env.POSTGRES_DSN || requireEnv('DATABASE_URL');
|
|
19
|
+
this.pool = new Pool({
|
|
20
|
+
connectionString,
|
|
21
|
+
max: 10,
|
|
22
|
+
idleTimeoutMillis: 30000,
|
|
23
|
+
connectionTimeoutMillis: 2000,
|
|
24
|
+
});
|
|
25
|
+
// 测试连接
|
|
26
|
+
try {
|
|
27
|
+
const client = await this.pool.connect();
|
|
28
|
+
await client.query('SELECT 1');
|
|
29
|
+
client.release();
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
throw new Error(`Failed to connect to PostgreSQL: ${error instanceof Error ? error.message : String(error)}`);
|
|
33
|
+
}
|
|
34
|
+
// 注册工具
|
|
35
|
+
this.registerAnalyzeFile();
|
|
36
|
+
this.registerCreateTable();
|
|
37
|
+
this.registerImportData();
|
|
38
|
+
this.registerQuery();
|
|
39
|
+
this.registerBulkInsert();
|
|
40
|
+
this.registerListTables();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 分析文件结构(CSV/TSV,支持 gzip)
|
|
44
|
+
*/
|
|
45
|
+
registerAnalyzeFile() {
|
|
46
|
+
this.registerTool({
|
|
47
|
+
name: 'analyze_file',
|
|
48
|
+
description: 'Analyze CSV/TSV file structure (supports gzip). Returns column names, data types, sample data, and suggested table schema',
|
|
49
|
+
inputSchema: {
|
|
50
|
+
type: 'object',
|
|
51
|
+
properties: {
|
|
52
|
+
file_path: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
description: 'Path to the CSV/TSV file (e.g., /opt/test/data.csv.gz)',
|
|
55
|
+
},
|
|
56
|
+
sample_rows: {
|
|
57
|
+
type: 'number',
|
|
58
|
+
description: 'Number of sample rows to analyze (default: 100)',
|
|
59
|
+
default: 100,
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
required: ['file_path'],
|
|
63
|
+
},
|
|
64
|
+
}, async (args) => {
|
|
65
|
+
const { file_path, sample_rows = 100 } = args;
|
|
66
|
+
try {
|
|
67
|
+
const fileContent = readFileSync(file_path);
|
|
68
|
+
const isGzip = fileContent[0] === 0x1f && fileContent[1] === 0x8b;
|
|
69
|
+
// 检测分隔符
|
|
70
|
+
let stream = createReadStream(file_path);
|
|
71
|
+
if (isGzip) {
|
|
72
|
+
stream = stream.pipe(createGunzip());
|
|
73
|
+
}
|
|
74
|
+
const lines = [];
|
|
75
|
+
const rl = createInterface({ input: stream });
|
|
76
|
+
for await (const line of rl) {
|
|
77
|
+
lines.push(line);
|
|
78
|
+
if (lines.length >= sample_rows + 1)
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
if (lines.length === 0) {
|
|
82
|
+
throw new ValidationError('File is empty');
|
|
83
|
+
}
|
|
84
|
+
// 检测分隔符
|
|
85
|
+
const firstLine = lines[0];
|
|
86
|
+
const delimiter = firstLine.includes('\t') ? '\t' : ',';
|
|
87
|
+
// 解析列名
|
|
88
|
+
const columns = firstLine.split(delimiter).map((col) => col.trim());
|
|
89
|
+
// 分析数据类型
|
|
90
|
+
const typeAnalysis = columns.map((colName, idx) => {
|
|
91
|
+
const samples = lines
|
|
92
|
+
.slice(1, Math.min(sample_rows + 1, lines.length))
|
|
93
|
+
.map((line) => line.split(delimiter)[idx]?.trim())
|
|
94
|
+
.filter((val) => val && val !== '');
|
|
95
|
+
const types = this.inferColumnType(samples);
|
|
96
|
+
return {
|
|
97
|
+
column_name: colName,
|
|
98
|
+
...types,
|
|
99
|
+
sample_values: samples.slice(0, 5),
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
// 生成建表语句
|
|
103
|
+
const tableName = file_path
|
|
104
|
+
.split('/')
|
|
105
|
+
.pop()
|
|
106
|
+
.replace(/\.(csv|tsv)(\.gz)?$/i, '')
|
|
107
|
+
.replace(/[^a-z0-9_]/gi, '_')
|
|
108
|
+
.toLowerCase();
|
|
109
|
+
const createTableSQL = this.generateCreateTableSQL(tableName, typeAnalysis);
|
|
110
|
+
return {
|
|
111
|
+
file_path,
|
|
112
|
+
is_gzipped: isGzip,
|
|
113
|
+
delimiter,
|
|
114
|
+
total_columns: columns.length,
|
|
115
|
+
total_sample_rows: lines.length - 1,
|
|
116
|
+
columns: typeAnalysis,
|
|
117
|
+
suggested_table_name: tableName,
|
|
118
|
+
create_table_sql: createTableSQL,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
throw new Error(`Failed to analyze file: ${error instanceof Error ? error.message : String(error)}`);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 创建表
|
|
128
|
+
*/
|
|
129
|
+
registerCreateTable() {
|
|
130
|
+
this.registerTool({
|
|
131
|
+
name: 'create_table',
|
|
132
|
+
description: 'Create a table in PostgreSQL',
|
|
133
|
+
inputSchema: {
|
|
134
|
+
type: 'object',
|
|
135
|
+
properties: {
|
|
136
|
+
table_name: {
|
|
137
|
+
type: 'string',
|
|
138
|
+
description: 'Name of the table to create',
|
|
139
|
+
},
|
|
140
|
+
columns: {
|
|
141
|
+
type: 'array',
|
|
142
|
+
description: 'Column definitions',
|
|
143
|
+
items: {
|
|
144
|
+
type: 'object',
|
|
145
|
+
properties: {
|
|
146
|
+
name: { type: 'string' },
|
|
147
|
+
type: { type: 'string' },
|
|
148
|
+
nullable: { type: 'boolean', default: true },
|
|
149
|
+
primary_key: { type: 'boolean', default: false },
|
|
150
|
+
},
|
|
151
|
+
required: ['name', 'type'],
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
if_not_exists: {
|
|
155
|
+
type: 'boolean',
|
|
156
|
+
description: 'Use IF NOT EXISTS clause (default: true)',
|
|
157
|
+
default: true,
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
required: ['table_name', 'columns'],
|
|
161
|
+
},
|
|
162
|
+
}, async (args) => {
|
|
163
|
+
const { table_name, columns, if_not_exists = true } = args;
|
|
164
|
+
const colDefs = columns.map((col) => {
|
|
165
|
+
let def = `"${col.name}" ${col.type}`;
|
|
166
|
+
if (!col.nullable)
|
|
167
|
+
def += ' NOT NULL';
|
|
168
|
+
if (col.primary_key)
|
|
169
|
+
def += ' PRIMARY KEY';
|
|
170
|
+
return def;
|
|
171
|
+
});
|
|
172
|
+
const sql = `CREATE TABLE ${if_not_exists ? 'IF NOT EXISTS ' : ''}"${table_name}" (
|
|
173
|
+
${colDefs.join(',\n ')}
|
|
174
|
+
);`;
|
|
175
|
+
try {
|
|
176
|
+
await this.pool.query(sql);
|
|
177
|
+
return {
|
|
178
|
+
success: true,
|
|
179
|
+
table_name,
|
|
180
|
+
sql,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
throw new Error(`Failed to create table: ${error instanceof Error ? error.message : String(error)}`);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 导入数据(批量)
|
|
190
|
+
*/
|
|
191
|
+
registerImportData() {
|
|
192
|
+
this.registerTool({
|
|
193
|
+
name: 'import_data',
|
|
194
|
+
description: 'Import data from CSV/TSV file into PostgreSQL table (supports gzip, batch insert)',
|
|
195
|
+
inputSchema: {
|
|
196
|
+
type: 'object',
|
|
197
|
+
properties: {
|
|
198
|
+
file_path: {
|
|
199
|
+
type: 'string',
|
|
200
|
+
description: 'Path to the CSV/TSV file',
|
|
201
|
+
},
|
|
202
|
+
table_name: {
|
|
203
|
+
type: 'string',
|
|
204
|
+
description: 'Target table name',
|
|
205
|
+
},
|
|
206
|
+
column_mapping: {
|
|
207
|
+
type: 'object',
|
|
208
|
+
description: 'Optional: Map file columns to table columns (key: file column, value: table column)',
|
|
209
|
+
},
|
|
210
|
+
truncate_before: {
|
|
211
|
+
type: 'boolean',
|
|
212
|
+
description: 'Truncate table before import (default: false)',
|
|
213
|
+
default: false,
|
|
214
|
+
},
|
|
215
|
+
batch_size: {
|
|
216
|
+
type: 'number',
|
|
217
|
+
description: 'Batch size for bulk insert (default: 1000)',
|
|
218
|
+
default: 1000,
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
required: ['file_path', 'table_name'],
|
|
222
|
+
},
|
|
223
|
+
}, async (args) => {
|
|
224
|
+
const { file_path, table_name, column_mapping, truncate_before = false, batch_size = 1000, } = args;
|
|
225
|
+
const client = await this.pool.connect();
|
|
226
|
+
try {
|
|
227
|
+
await client.query('BEGIN');
|
|
228
|
+
if (truncate_before) {
|
|
229
|
+
await client.query(`TRUNCATE TABLE "${table_name}"`);
|
|
230
|
+
}
|
|
231
|
+
// 读取文件
|
|
232
|
+
const fileContent = readFileSync(file_path);
|
|
233
|
+
const isGzip = fileContent[0] === 0x1f && fileContent[1] === 0x8b;
|
|
234
|
+
let stream = createReadStream(file_path);
|
|
235
|
+
if (isGzip) {
|
|
236
|
+
stream = stream.pipe(createGunzip());
|
|
237
|
+
}
|
|
238
|
+
const rl = createInterface({ input: stream });
|
|
239
|
+
let header = [];
|
|
240
|
+
let batch = [];
|
|
241
|
+
let totalRows = 0;
|
|
242
|
+
let isFirstLine = true;
|
|
243
|
+
for await (const line of rl) {
|
|
244
|
+
if (isFirstLine) {
|
|
245
|
+
const delimiter = line.includes('\t') ? '\t' : ',';
|
|
246
|
+
header = line.split(delimiter).map((col) => col.trim());
|
|
247
|
+
isFirstLine = false;
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
const delimiter = line.includes('\t') ? '\t' : ',';
|
|
251
|
+
const values = line.split(delimiter).map((val) => val.trim());
|
|
252
|
+
batch.push(values);
|
|
253
|
+
if (batch.length >= batch_size) {
|
|
254
|
+
await this.executeBatchInsert(client, table_name, header, batch, column_mapping);
|
|
255
|
+
totalRows += batch.length;
|
|
256
|
+
batch = [];
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// 插入剩余数据
|
|
260
|
+
if (batch.length > 0) {
|
|
261
|
+
await this.executeBatchInsert(client, table_name, header, batch, column_mapping);
|
|
262
|
+
totalRows += batch.length;
|
|
263
|
+
}
|
|
264
|
+
await client.query('COMMIT');
|
|
265
|
+
return {
|
|
266
|
+
success: true,
|
|
267
|
+
table_name,
|
|
268
|
+
rows_imported: totalRows,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
await client.query('ROLLBACK');
|
|
273
|
+
throw new Error(`Failed to import data: ${error instanceof Error ? error.message : String(error)}`);
|
|
274
|
+
}
|
|
275
|
+
finally {
|
|
276
|
+
client.release();
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* 执行查询
|
|
282
|
+
*/
|
|
283
|
+
registerQuery() {
|
|
284
|
+
this.registerTool({
|
|
285
|
+
name: 'query',
|
|
286
|
+
description: 'Execute a SQL query and return results',
|
|
287
|
+
inputSchema: {
|
|
288
|
+
type: 'object',
|
|
289
|
+
properties: {
|
|
290
|
+
sql: {
|
|
291
|
+
type: 'string',
|
|
292
|
+
description: 'SQL query to execute',
|
|
293
|
+
},
|
|
294
|
+
params: {
|
|
295
|
+
type: 'array',
|
|
296
|
+
description: 'Optional query parameters',
|
|
297
|
+
items: {},
|
|
298
|
+
},
|
|
299
|
+
max_rows: {
|
|
300
|
+
type: 'number',
|
|
301
|
+
description: 'Maximum number of rows to return (default: 1000)',
|
|
302
|
+
default: 1000,
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
required: ['sql'],
|
|
306
|
+
},
|
|
307
|
+
}, async (args) => {
|
|
308
|
+
const { sql, params = [], max_rows = 1000 } = args;
|
|
309
|
+
try {
|
|
310
|
+
const result = await this.pool.query(sql, params);
|
|
311
|
+
// 某些 SQL 语句(如 TRUNCATE, DROP, CREATE)不返回 rows
|
|
312
|
+
const rows = result.rows || [];
|
|
313
|
+
return {
|
|
314
|
+
rows: rows.slice(0, max_rows),
|
|
315
|
+
row_count: result.rowCount ?? 0,
|
|
316
|
+
total_rows: rows.length,
|
|
317
|
+
truncated: rows.length > max_rows,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
throw new Error(`Query failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* 批量插入
|
|
327
|
+
*/
|
|
328
|
+
registerBulkInsert() {
|
|
329
|
+
this.registerTool({
|
|
330
|
+
name: 'bulk_insert',
|
|
331
|
+
description: 'Bulk insert rows into a table',
|
|
332
|
+
inputSchema: {
|
|
333
|
+
type: 'object',
|
|
334
|
+
properties: {
|
|
335
|
+
table_name: { type: 'string' },
|
|
336
|
+
columns: {
|
|
337
|
+
type: 'array',
|
|
338
|
+
items: { type: 'string' },
|
|
339
|
+
description: 'Column names',
|
|
340
|
+
},
|
|
341
|
+
rows: {
|
|
342
|
+
type: 'array',
|
|
343
|
+
description: 'Array of row values',
|
|
344
|
+
items: {
|
|
345
|
+
type: 'array',
|
|
346
|
+
items: {},
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
required: ['table_name', 'columns', 'rows'],
|
|
351
|
+
},
|
|
352
|
+
}, async (args) => {
|
|
353
|
+
const { table_name, columns, rows } = args;
|
|
354
|
+
try {
|
|
355
|
+
const placeholders = rows
|
|
356
|
+
.map((_, i) => `(${columns.map((_, j) => `$${i * columns.length + j + 1}`).join(', ')})`)
|
|
357
|
+
.join(', ');
|
|
358
|
+
const sql = `INSERT INTO "${table_name}" (${columns.map((c) => `"${c}"`).join(', ')}) VALUES ${placeholders}`;
|
|
359
|
+
const values = rows.flat();
|
|
360
|
+
await this.pool.query(sql, values);
|
|
361
|
+
return {
|
|
362
|
+
success: true,
|
|
363
|
+
rows_inserted: rows.length,
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
throw new Error(`Bulk insert failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* 列出表
|
|
373
|
+
*/
|
|
374
|
+
registerListTables() {
|
|
375
|
+
this.registerTool({
|
|
376
|
+
name: 'list_tables',
|
|
377
|
+
description: 'List all tables in the database',
|
|
378
|
+
inputSchema: {
|
|
379
|
+
type: 'object',
|
|
380
|
+
properties: {
|
|
381
|
+
schema: {
|
|
382
|
+
type: 'string',
|
|
383
|
+
description: 'Schema name (default: public)',
|
|
384
|
+
default: 'public',
|
|
385
|
+
},
|
|
386
|
+
},
|
|
387
|
+
},
|
|
388
|
+
}, async (args) => {
|
|
389
|
+
const { schema = 'public' } = args;
|
|
390
|
+
try {
|
|
391
|
+
const result = await this.pool.query(`SELECT table_name FROM information_schema.tables WHERE table_schema = $1 ORDER BY table_name`, [schema]);
|
|
392
|
+
return {
|
|
393
|
+
schema,
|
|
394
|
+
tables: result.rows.map((r) => r.table_name),
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
catch (error) {
|
|
398
|
+
throw new Error(`Failed to list tables: ${error instanceof Error ? error.message : String(error)}`);
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
// ========== 辅助方法 ==========
|
|
403
|
+
inferColumnType(samples) {
|
|
404
|
+
if (samples.length === 0) {
|
|
405
|
+
return {
|
|
406
|
+
suggested_type: 'TEXT',
|
|
407
|
+
is_numeric: false,
|
|
408
|
+
is_date: false,
|
|
409
|
+
has_nulls: true,
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
const nonEmpty = samples.filter((s) => s && s !== '');
|
|
413
|
+
const hasNulls = nonEmpty.length < samples.length;
|
|
414
|
+
// 检查是否全是数字
|
|
415
|
+
const allNumeric = nonEmpty.every((s) => /^-?\d+(\.\d+)?$/.test(s));
|
|
416
|
+
if (allNumeric) {
|
|
417
|
+
const hasDecimal = nonEmpty.some((s) => s.includes('.'));
|
|
418
|
+
return {
|
|
419
|
+
suggested_type: hasDecimal ? 'NUMERIC(20,6)' : 'BIGINT',
|
|
420
|
+
is_numeric: true,
|
|
421
|
+
is_date: false,
|
|
422
|
+
has_nulls: hasNulls,
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
// 检查是否是日期
|
|
426
|
+
const allDate = nonEmpty.every((s) => /^\d{4}-\d{2}-\d{2}/.test(s) || /^\d{1,2}\/\d{1,2}\/\d{4}/.test(s));
|
|
427
|
+
if (allDate) {
|
|
428
|
+
return {
|
|
429
|
+
suggested_type: 'DATE',
|
|
430
|
+
is_numeric: false,
|
|
431
|
+
is_date: true,
|
|
432
|
+
has_nulls: hasNulls,
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
return {
|
|
436
|
+
suggested_type: 'TEXT',
|
|
437
|
+
is_numeric: false,
|
|
438
|
+
is_date: false,
|
|
439
|
+
has_nulls: hasNulls,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
generateCreateTableSQL(tableName, columns) {
|
|
443
|
+
const colDefs = columns.map((col) => {
|
|
444
|
+
let def = ` "${col.column_name}" ${col.suggested_type}`;
|
|
445
|
+
if (!col.has_nulls)
|
|
446
|
+
def += ' NOT NULL';
|
|
447
|
+
return def;
|
|
448
|
+
});
|
|
449
|
+
return `CREATE TABLE IF NOT EXISTS "${tableName}" (\n${colDefs.join(',\n')}\n);`;
|
|
450
|
+
}
|
|
451
|
+
async executeBatchInsert(client, tableName, header, batch, columnMapping) {
|
|
452
|
+
const columns = columnMapping
|
|
453
|
+
? header.map((h) => columnMapping[h] || h)
|
|
454
|
+
: header;
|
|
455
|
+
const placeholders = batch
|
|
456
|
+
.map((_, i) => `(${columns.map((_, j) => `$${i * columns.length + j + 1}`).join(', ')})`)
|
|
457
|
+
.join(', ');
|
|
458
|
+
const sql = `INSERT INTO "${tableName}" (${columns.map((c) => `"${c}"`).join(', ')}) VALUES ${placeholders}`;
|
|
459
|
+
const values = batch.flat();
|
|
460
|
+
await client.query(sql, values);
|
|
461
|
+
}
|
|
462
|
+
async cleanup() {
|
|
463
|
+
await this.pool?.end();
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pero-mcp/postgresql",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for PostgreSQL database operations (analyze, import, query)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"postgresql-mcp": "./dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
19
|
+
"pg": "^8.13.1",
|
|
20
|
+
"@pero-mcp/core": "0.1.0",
|
|
21
|
+
"@pero-mcp/shared": "0.1.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^22.10.5",
|
|
25
|
+
"@types/pg": "^8.11.10",
|
|
26
|
+
"typescript": "^5.7.3"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist"
|
|
30
|
+
],
|
|
31
|
+
"keywords": [
|
|
32
|
+
"mcp",
|
|
33
|
+
"postgresql",
|
|
34
|
+
"database",
|
|
35
|
+
"model-context-protocol"
|
|
36
|
+
],
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc",
|
|
40
|
+
"dev": "tsc --watch",
|
|
41
|
+
"clean": "rm -rf dist *.tsbuildinfo",
|
|
42
|
+
"lint": "tsc --noEmit",
|
|
43
|
+
"start": "node dist/cli.js"
|
|
44
|
+
}
|
|
45
|
+
}
|