mcp-server-db2i 2.0.0 → 2.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/README.md +11 -0
- package/dist/config.d.ts +104 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +273 -5
- package/dist/config.js.map +1 -1
- package/dist/customTools/context.d.ts +27 -0
- package/dist/customTools/context.d.ts.map +1 -0
- package/dist/customTools/context.js +35 -0
- package/dist/customTools/context.js.map +1 -0
- package/dist/customTools/execute.d.ts +22 -0
- package/dist/customTools/execute.d.ts.map +1 -0
- package/dist/customTools/execute.js +134 -0
- package/dist/customTools/execute.js.map +1 -0
- package/dist/customTools/loader.d.ts +56 -0
- package/dist/customTools/loader.d.ts.map +1 -0
- package/dist/customTools/loader.js +213 -0
- package/dist/customTools/loader.js.map +1 -0
- package/dist/customTools/params.d.ts +23 -0
- package/dist/customTools/params.d.ts.map +1 -0
- package/dist/customTools/params.js +93 -0
- package/dist/customTools/params.js.map +1 -0
- package/dist/customTools/registry.d.ts +18 -0
- package/dist/customTools/registry.d.ts.map +1 -0
- package/dist/customTools/registry.js +23 -0
- package/dist/customTools/registry.js.map +1 -0
- package/dist/customTools/schema.d.ts +127 -0
- package/dist/customTools/schema.d.ts.map +1 -0
- package/dist/customTools/schema.js +193 -0
- package/dist/customTools/schema.js.map +1 -0
- package/dist/db/connection.d.ts +9 -0
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +91 -0
- package/dist/db/connection.js.map +1 -1
- package/dist/db/sqlServices.d.ts +65 -0
- package/dist/db/sqlServices.d.ts.map +1 -0
- package/dist/db/sqlServices.js +311 -0
- package/dist/db/sqlServices.js.map +1 -0
- package/dist/index.js +23 -1
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +260 -104
- package/dist/server.js.map +1 -1
- package/dist/tools/metadata.d.ts +24 -12
- package/dist/tools/metadata.d.ts.map +1 -1
- package/dist/tools/metadata.js +43 -8
- package/dist/tools/metadata.js.map +1 -1
- package/dist/tools/query.d.ts +5 -0
- package/dist/tools/query.d.ts.map +1 -1
- package/dist/tools/query.js +50 -2
- package/dist/tools/query.js.map +1 -1
- package/dist/tools/sqlLimit.d.ts +5 -0
- package/dist/tools/sqlLimit.d.ts.map +1 -1
- package/dist/tools/sqlLimit.js +12 -0
- package/dist/tools/sqlLimit.js.map +1 -1
- package/dist/tools/sqlServices.d.ts +51 -0
- package/dist/tools/sqlServices.d.ts.map +1 -0
- package/dist/tools/sqlServices.js +122 -0
- package/dist/tools/sqlServices.js.map +1 -0
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +40 -1
- package/dist/transports/http.js.map +1 -1
- package/dist/utils/formatResult.d.ts +22 -0
- package/dist/utils/formatResult.d.ts.map +1 -0
- package/dist/utils/formatResult.js +66 -0
- package/dist/utils/formatResult.js.map +1 -0
- package/dist/utils/security/schemaAllowlist.d.ts +27 -0
- package/dist/utils/security/schemaAllowlist.d.ts.map +1 -0
- package/dist/utils/security/schemaAllowlist.js +156 -0
- package/dist/utils/security/schemaAllowlist.js.map +1 -0
- package/dist/utils/security/sqlSecurityValidator.d.ts +0 -4
- package/dist/utils/security/sqlSecurityValidator.d.ts.map +1 -1
- package/dist/utils/security/sqlSecurityValidator.js +134 -38
- package/dist/utils/security/sqlSecurityValidator.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IBM i SQL services used by validate_query, get_object_ddl, and get_related_objects.
|
|
3
|
+
*
|
|
4
|
+
* PARSE_STATEMENT and RELATED_OBJECTS run on the read-only query pool.
|
|
5
|
+
* GENERATE_SQL runs on the procedure pool because a read-only connection rejects it.
|
|
6
|
+
*/
|
|
7
|
+
import { executeProcedure, executeQuery } from './connection.js';
|
|
8
|
+
import { isSchemaAllowed } from '../utils/security/schemaAllowlist.js';
|
|
9
|
+
export const SQL_OBJECT_TYPES = [
|
|
10
|
+
'TABLE',
|
|
11
|
+
'VIEW',
|
|
12
|
+
'INDEX',
|
|
13
|
+
'ALIAS',
|
|
14
|
+
'TRIGGER',
|
|
15
|
+
'FUNCTION',
|
|
16
|
+
'PROCEDURE',
|
|
17
|
+
'SEQUENCE',
|
|
18
|
+
];
|
|
19
|
+
const TABLE_NAME_TYPES = new Set(['TABLE', 'VIEW', 'ALIAS']);
|
|
20
|
+
const ROUTINE_NAME_TYPES = new Set(['FUNCTION', 'PROCEDURE']);
|
|
21
|
+
const UNQUOTED_NAME = /^[A-Z0-9_@#$]{1,128}$/;
|
|
22
|
+
const LOOKUP_CHUNK = 40;
|
|
23
|
+
const PARSE_SQL = `
|
|
24
|
+
SELECT NAME_TYPE, SCHEMA, NAME, COLUMN_NAME, SQL_STATEMENT_TYPE
|
|
25
|
+
FROM TABLE(QSYS2.PARSE_STATEMENT(CAST(? AS CLOB(2M)))) X
|
|
26
|
+
`;
|
|
27
|
+
const routineCache = new Map();
|
|
28
|
+
export function clearRoutineCache() {
|
|
29
|
+
routineCache.clear();
|
|
30
|
+
}
|
|
31
|
+
function cell(value) {
|
|
32
|
+
if (value == null) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const text = String(value).trim();
|
|
36
|
+
return text.length > 0 ? text.toUpperCase() : null;
|
|
37
|
+
}
|
|
38
|
+
function textCell(value) {
|
|
39
|
+
if (value == null) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
const text = String(value).trim();
|
|
43
|
+
return text.length > 0 ? text : null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* True when the failure is QSYS2.PARSE_STATEMENT missing (SQL0204), rather than
|
|
47
|
+
* a statement that parsed to no rows.
|
|
48
|
+
*/
|
|
49
|
+
export function isParseStatementMissing(error) {
|
|
50
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
51
|
+
return /PARSE_STATEMENT/i.test(message) && (/\bSQL0204\b/.test(message) || /not found/i.test(message));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Reject names that are not safe to embed in the GENERATE_SQL call.
|
|
55
|
+
* The procedure's named arguments are literals, not parameter markers.
|
|
56
|
+
*/
|
|
57
|
+
export function requireSqlName(value, label) {
|
|
58
|
+
const name = value.trim().toUpperCase();
|
|
59
|
+
if (!UNQUOTED_NAME.test(name)) {
|
|
60
|
+
throw new Error(`${label} must be an unquoted IBM i name (letters, digits, and _ @ # $).`);
|
|
61
|
+
}
|
|
62
|
+
return name;
|
|
63
|
+
}
|
|
64
|
+
export async function parseStatement(sql, sessionId) {
|
|
65
|
+
const result = await executeQuery(PARSE_SQL, [sql], sessionId);
|
|
66
|
+
return result.rows.map((row) => ({
|
|
67
|
+
nameType: cell(row.NAME_TYPE) ?? '',
|
|
68
|
+
schema: cell(row.SCHEMA),
|
|
69
|
+
name: cell(row.NAME),
|
|
70
|
+
columnName: cell(row.COLUMN_NAME),
|
|
71
|
+
statementType: cell(row.SQL_STATEMENT_TYPE),
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
export async function hasRoutine(schema, name, sessionId) {
|
|
75
|
+
const routineSchema = schema.trim().toUpperCase();
|
|
76
|
+
const routineName = name.trim().toUpperCase();
|
|
77
|
+
const key = `${sessionId ?? 'global'}|${routineSchema}|${routineName}`;
|
|
78
|
+
const cached = routineCache.get(key);
|
|
79
|
+
if (cached !== undefined) {
|
|
80
|
+
return cached;
|
|
81
|
+
}
|
|
82
|
+
const result = await executeQuery(`SELECT ROUTINE_NAME FROM QSYS2.SYSROUTINES WHERE ROUTINE_SCHEMA = ? AND ROUTINE_NAME = ? FETCH FIRST 1 ROW ONLY`, [routineSchema, routineName], sessionId);
|
|
83
|
+
const found = result.rows.length > 0;
|
|
84
|
+
routineCache.set(key, found);
|
|
85
|
+
return found;
|
|
86
|
+
}
|
|
87
|
+
function allowlistViolation(kind, schema, name, allowed) {
|
|
88
|
+
return `${kind} ${schema}.${name} is not in QUERY_ALLOWED_SCHEMAS (${allowed.join(', ')}).`;
|
|
89
|
+
}
|
|
90
|
+
function unresolvedTable(table) {
|
|
91
|
+
return `Unqualified table ${table} has no default schema. Set DB2I_SCHEMA or qualify the table with a library.`;
|
|
92
|
+
}
|
|
93
|
+
async function lookupPairs(sqlPrefix, tuples, keyOf, sessionId) {
|
|
94
|
+
const found = new Set();
|
|
95
|
+
const width = tuples[0]?.length ?? 0;
|
|
96
|
+
if (width === 0) {
|
|
97
|
+
return found;
|
|
98
|
+
}
|
|
99
|
+
for (let offset = 0; offset < tuples.length; offset += LOOKUP_CHUNK) {
|
|
100
|
+
const chunk = tuples.slice(offset, offset + LOOKUP_CHUNK);
|
|
101
|
+
const values = chunk.map(() => `(${Array(width).fill('?').join(', ')})`).join(', ');
|
|
102
|
+
const result = await executeQuery(`${sqlPrefix} (VALUES ${values})`, chunk.flat(), sessionId);
|
|
103
|
+
for (const row of result.rows) {
|
|
104
|
+
found.add(keyOf(row));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return found;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Parse a statement and check the names it uses against the catalog.
|
|
111
|
+
* Does not run the statement. Throws when PARSE_STATEMENT itself is missing.
|
|
112
|
+
*/
|
|
113
|
+
export async function inspectStatement(sql, options = {}) {
|
|
114
|
+
const parsed = await parseStatement(sql, options.sessionId);
|
|
115
|
+
if (parsed.length === 0) {
|
|
116
|
+
return {
|
|
117
|
+
parsed: false,
|
|
118
|
+
statementType: null,
|
|
119
|
+
missingTables: [],
|
|
120
|
+
missingColumns: [],
|
|
121
|
+
missingRoutines: [],
|
|
122
|
+
violations: ['The statement could not be parsed.'],
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const statementType = parsed.find((row) => row.statementType)?.statementType ?? null;
|
|
126
|
+
const violations = [];
|
|
127
|
+
const defaultSchema = options.defaultSchema?.trim().toUpperCase() || undefined;
|
|
128
|
+
const allowed = options.allowedSchemas;
|
|
129
|
+
const tables = [];
|
|
130
|
+
const seenTables = new Set();
|
|
131
|
+
for (const row of parsed) {
|
|
132
|
+
if (!TABLE_NAME_TYPES.has(row.nameType) || !row.name) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const schema = row.schema ?? defaultSchema;
|
|
136
|
+
if (!schema) {
|
|
137
|
+
violations.push(unresolvedTable(row.name));
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (allowed && !isSchemaAllowed(schema, allowed)) {
|
|
141
|
+
violations.push(allowlistViolation('Table', schema, row.name, allowed));
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
const key = `${schema}.${row.name}`;
|
|
145
|
+
if (seenTables.has(key)) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
seenTables.add(key);
|
|
149
|
+
tables.push({ schema, table: row.name });
|
|
150
|
+
}
|
|
151
|
+
const specificColumns = [];
|
|
152
|
+
const seenColumns = new Set();
|
|
153
|
+
const looseColumns = new Set();
|
|
154
|
+
for (const row of parsed) {
|
|
155
|
+
if (row.nameType !== 'COLUMN' || !row.columnName) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (!row.name) {
|
|
159
|
+
looseColumns.add(row.columnName);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const schema = row.schema ?? tables.find((table) => table.table === row.name)?.schema ?? defaultSchema;
|
|
163
|
+
if (!schema) {
|
|
164
|
+
violations.push(`Column ${row.columnName} on ${row.name} could not be checked because the table has no schema.`);
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (allowed && !isSchemaAllowed(schema, allowed)) {
|
|
168
|
+
violations.push(allowlistViolation('Table', schema, row.name, allowed));
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
const key = `${schema}.${row.name}.${row.columnName}`;
|
|
172
|
+
if (seenColumns.has(key)) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
seenColumns.add(key);
|
|
176
|
+
specificColumns.push({ schema, table: row.name, column: row.columnName });
|
|
177
|
+
}
|
|
178
|
+
if (looseColumns.size > 0 && tables.length === 0) {
|
|
179
|
+
for (const column of looseColumns) {
|
|
180
|
+
violations.push(`Column ${column} could not be checked because the statement names no table.`);
|
|
181
|
+
}
|
|
182
|
+
looseColumns.clear();
|
|
183
|
+
}
|
|
184
|
+
const routines = [];
|
|
185
|
+
const seenRoutines = new Set();
|
|
186
|
+
for (const row of parsed) {
|
|
187
|
+
if (!ROUTINE_NAME_TYPES.has(row.nameType) || !row.name) {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
// Unqualified functions are built-ins (UPPER, COALESCE). Skip them.
|
|
191
|
+
if (!row.schema) {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (allowed && !isSchemaAllowed(row.schema, allowed)) {
|
|
195
|
+
violations.push(allowlistViolation('Routine', row.schema, row.name, allowed));
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const key = `${row.schema}.${row.name}`;
|
|
199
|
+
if (seenRoutines.has(key)) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
seenRoutines.add(key);
|
|
203
|
+
routines.push({ schema: row.schema, name: row.name });
|
|
204
|
+
}
|
|
205
|
+
const missingTables = [];
|
|
206
|
+
const missingColumns = [];
|
|
207
|
+
const missingRoutines = [];
|
|
208
|
+
if (tables.length > 0) {
|
|
209
|
+
const existing = await lookupPairs('SELECT TABLE_SCHEMA, TABLE_NAME FROM QSYS2.SYSTABLES WHERE (TABLE_SCHEMA, TABLE_NAME) IN', tables.map((table) => [table.schema, table.table]), (row) => `${cell(row.TABLE_SCHEMA)}.${cell(row.TABLE_NAME)}`, options.sessionId);
|
|
210
|
+
for (const table of tables) {
|
|
211
|
+
const key = `${table.schema}.${table.table}`;
|
|
212
|
+
if (!existing.has(key)) {
|
|
213
|
+
missingTables.push(key);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (specificColumns.length > 0) {
|
|
218
|
+
const existing = await lookupPairs('SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME FROM QSYS2.SYSCOLUMNS WHERE (TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME) IN', specificColumns.map((column) => [column.schema, column.table, column.column]), (row) => `${cell(row.TABLE_SCHEMA)}.${cell(row.TABLE_NAME)}.${cell(row.COLUMN_NAME)}`, options.sessionId);
|
|
219
|
+
for (const column of specificColumns) {
|
|
220
|
+
const key = `${column.schema}.${column.table}.${column.column}`;
|
|
221
|
+
if (!existing.has(key)) {
|
|
222
|
+
missingColumns.push(key);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (looseColumns.size > 0 && tables.length > 0) {
|
|
227
|
+
const found = await lookupLooseColumns(tables, [...looseColumns], options.sessionId);
|
|
228
|
+
for (const column of looseColumns) {
|
|
229
|
+
if (!found.has(column)) {
|
|
230
|
+
missingColumns.push(column);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (routines.length > 0) {
|
|
235
|
+
const existing = await lookupPairs('SELECT ROUTINE_SCHEMA, ROUTINE_NAME FROM QSYS2.SYSROUTINES WHERE (ROUTINE_SCHEMA, ROUTINE_NAME) IN', routines.map((routine) => [routine.schema, routine.name]), (row) => `${cell(row.ROUTINE_SCHEMA)}.${cell(row.ROUTINE_NAME)}`, options.sessionId);
|
|
236
|
+
for (const routine of routines) {
|
|
237
|
+
const key = `${routine.schema}.${routine.name}`;
|
|
238
|
+
if (!existing.has(key)) {
|
|
239
|
+
missingRoutines.push(key);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (!statementType) {
|
|
244
|
+
violations.push('The statement type could not be determined.');
|
|
245
|
+
}
|
|
246
|
+
else if (statementType !== 'QUERY') {
|
|
247
|
+
violations.push(`Statement type is ${statementType}.`);
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
parsed: true,
|
|
251
|
+
statementType,
|
|
252
|
+
missingTables,
|
|
253
|
+
missingColumns,
|
|
254
|
+
missingRoutines,
|
|
255
|
+
violations,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
async function lookupLooseColumns(tables, columns, sessionId) {
|
|
259
|
+
const found = new Set();
|
|
260
|
+
const tableValues = tables.map(() => '(?, ?)').join(', ');
|
|
261
|
+
const columnValues = columns.map(() => '?').join(', ');
|
|
262
|
+
const sql = `
|
|
263
|
+
SELECT COLUMN_NAME
|
|
264
|
+
FROM QSYS2.SYSCOLUMNS
|
|
265
|
+
WHERE (TABLE_SCHEMA, TABLE_NAME) IN (VALUES ${tableValues})
|
|
266
|
+
AND COLUMN_NAME IN (${columnValues})
|
|
267
|
+
`;
|
|
268
|
+
const params = [...tables.flatMap((table) => [table.schema, table.table]), ...columns];
|
|
269
|
+
const result = await executeQuery(sql, params, sessionId);
|
|
270
|
+
for (const row of result.rows) {
|
|
271
|
+
const name = cell(row.COLUMN_NAME);
|
|
272
|
+
if (name) {
|
|
273
|
+
found.add(name);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return found;
|
|
277
|
+
}
|
|
278
|
+
export async function generateObjectDdl(input) {
|
|
279
|
+
const schema = requireSqlName(input.schema, 'Schema');
|
|
280
|
+
const objectName = requireSqlName(input.objectName, 'Object name');
|
|
281
|
+
const objectType = input.objectType.trim().toUpperCase();
|
|
282
|
+
if (!SQL_OBJECT_TYPES.includes(objectType)) {
|
|
283
|
+
throw new Error(`Object type must be one of: ${SQL_OBJECT_TYPES.join(', ')}.`);
|
|
284
|
+
}
|
|
285
|
+
const sql = `CALL QSYS2.GENERATE_SQL(DATABASE_OBJECT_NAME => '${objectName}', DATABASE_OBJECT_LIBRARY_NAME => '${schema}', DATABASE_OBJECT_TYPE => '${objectType}')`;
|
|
286
|
+
const result = await executeProcedure(sql, [], input.sessionId);
|
|
287
|
+
const lines = result.rows
|
|
288
|
+
.map((row) => ({
|
|
289
|
+
sequence: Number(row.SRCSEQ ?? 0),
|
|
290
|
+
text: String(row.SRCDTA ?? '').replace(/\s+$/, ''),
|
|
291
|
+
}))
|
|
292
|
+
.sort((left, right) => left.sequence - right.sequence)
|
|
293
|
+
.map((line) => line.text);
|
|
294
|
+
if (lines.length === 0) {
|
|
295
|
+
throw new Error(`QSYS2.GENERATE_SQL returned no source for ${schema}.${objectName}.`);
|
|
296
|
+
}
|
|
297
|
+
return lines.join('\n');
|
|
298
|
+
}
|
|
299
|
+
export async function listRelatedObjects(schema, table, sessionId) {
|
|
300
|
+
const result = await executeQuery(`SELECT SQL_OBJECT_TYPE, SCHEMA_NAME, SQL_NAME, LIBRARY_NAME, SYSTEM_NAME, OBJECT_TEXT
|
|
301
|
+
FROM TABLE(SYSTOOLS.RELATED_OBJECTS(?, ?)) X`, [schema, table], sessionId);
|
|
302
|
+
return result.rows.map((row) => ({
|
|
303
|
+
sql_object_type: textCell(row.SQL_OBJECT_TYPE) ?? '',
|
|
304
|
+
schema_name: textCell(row.SCHEMA_NAME),
|
|
305
|
+
sql_name: textCell(row.SQL_NAME),
|
|
306
|
+
library_name: textCell(row.LIBRARY_NAME),
|
|
307
|
+
system_name: textCell(row.SYSTEM_NAME),
|
|
308
|
+
object_text: textCell(row.OBJECT_TEXT),
|
|
309
|
+
}));
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=sqlServices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlServices.js","sourceRoot":"","sources":["../../src/db/sqlServices.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -15,11 +15,13 @@
|
|
|
15
15
|
* - 'both': Both transports simultaneously
|
|
16
16
|
*/
|
|
17
17
|
import { serveStdio } from '@modelcontextprotocol/server/stdio';
|
|
18
|
-
import { loadConfig, isHttpEnabled, isStdioEnabled, getTransportMode, getHttpConfig } from './config.js';
|
|
18
|
+
import { loadConfig, isHttpEnabled, isStdioEnabled, getTransportMode, getHttpConfig, getEnabledTools, getResponseFormat, jdbcConnectionSecurity, } from './config.js';
|
|
19
19
|
import { initializePool, testConnection, closeGlobalPool } from './db/connection.js';
|
|
20
20
|
import { logger, flushLogger } from './utils/logger.js';
|
|
21
21
|
import { getRateLimiter } from './utils/rateLimiter.js';
|
|
22
22
|
import { createServer, SERVER_NAME, SERVER_VERSION } from './server.js';
|
|
23
|
+
import { loadCustomToolsFromEnv } from './customTools/loader.js';
|
|
24
|
+
import { setCustomTools } from './customTools/registry.js';
|
|
23
25
|
import { startHttpServer, shutdownHttpServer } from './transports/http.js';
|
|
24
26
|
/**
|
|
25
27
|
* Main entry point
|
|
@@ -58,6 +60,26 @@ async function main() {
|
|
|
58
60
|
logger.info({ transport: transportMode }, 'Starting MCP server...');
|
|
59
61
|
// Initialize rate limiter (logs its own config)
|
|
60
62
|
getRateLimiter();
|
|
63
|
+
const jdbcSecurity = jdbcConnectionSecurity();
|
|
64
|
+
if (jdbcSecurity.accessOverride !== undefined) {
|
|
65
|
+
logger.warn({ access: jdbcSecurity.accessOverride }, 'DB2I_JDBC_OPTIONS sets access and overrides the read only default');
|
|
66
|
+
}
|
|
67
|
+
if (!jdbcSecurity.secure) {
|
|
68
|
+
logger.warn('Database connection is not using TLS. Set secure=true in DB2I_JDBC_OPTIONS after the IBM i host servers are configured for SSL.');
|
|
69
|
+
}
|
|
70
|
+
// Validates tool files and MCP_TOOLS_ENABLED / MCP_TOOLS_DISABLED before any transport starts
|
|
71
|
+
const customTools = loadCustomToolsFromEnv();
|
|
72
|
+
setCustomTools(customTools);
|
|
73
|
+
const enabledTools = getEnabledTools(customTools.tools);
|
|
74
|
+
if (enabledTools.length === 0) {
|
|
75
|
+
logger.warn('All tools are disabled by MCP_TOOLS_ENABLED / MCP_TOOLS_DISABLED');
|
|
76
|
+
}
|
|
77
|
+
logger.info({
|
|
78
|
+
tools: enabledTools,
|
|
79
|
+
customTools: customTools.tools.length,
|
|
80
|
+
annotations: customTools.annotations.length,
|
|
81
|
+
responseFormat: getResponseFormat(),
|
|
82
|
+
}, 'Tool configuration loaded');
|
|
61
83
|
// Check which transports are enabled
|
|
62
84
|
const stdioEnabled = isStdioEnabled();
|
|
63
85
|
const httpEnabled = isHttpEnabled();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAA0B,MAAM,oCAAoC,CAAC;AAIxF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* - HTTP mode: Uses session-specific connection pool (with sessionConfig)
|
|
10
10
|
*/
|
|
11
11
|
import { McpServer } from '@modelcontextprotocol/server';
|
|
12
|
-
import type
|
|
12
|
+
import { type DB2iConfig } from './config.js';
|
|
13
13
|
export declare const SERVER_NAME: string;
|
|
14
14
|
export declare const SERVER_VERSION: string;
|
|
15
15
|
/**
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAGzD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAGzD,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AA2BlF,eAAO,MAAM,WAAW,QAAmB,CAAC;AAC5C,eAAO,MAAM,cAAc,QAAsB,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,MAAM,EAAE,UAAU,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB,CAAC;AA2JF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,SAAS,UAAU,EAC/D,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAC9D,YAAY,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,cAAc,GAC9B,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,eAAe,CAAC,CAuC3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAoUtF"}
|